std::set
to posortowane drzewo. Udostępnia metody begin
i end
, więc mogę uzyskać minimum i maksimum oraz lower_bound
i upper_bound
dla wyszukiwania binarnego. Ale co jeśli chcę, aby iterator wskazywał środkowy element (lub jeden z nich, jeśli jest tam nawet liczba elementów)?Wydajny sposób, aby uzyskać środkową (medianę) std :: set?
Czy jest to skuteczny sposób (O(log(size))
, nie O(size)
), aby to zrobić?
{1} => 1
{1,2} => 1 or 2
{1,2,3} => 2
{1,2,3,4} => 2 or 3 (but in the same direction from middle as for {1,2})
{1,312,10000,14000,152333} => 10000
Sortowanie binarnym drzewo może być i zwykle jest szczegółowością implementacji std :: set, ale nie jest to wymagane. Jeśli potrzebujesz posortowanej tablicy lub drzewa binarnego, lepiej użyć tego, czego potrzebujesz. –
@ ÖöTiib, potrzebuję dynamicznie wstawiać elementy i dostać środek zestawu. Posortowana tablica/wektor spowoduje wstawienie jako 'O (n)', ale chciałbym, aby zarówno wstawianie, jak i zapytanie działały 'O (lb (n))'. Wiem, że drzewo Decart z niejawnym kluczem pozwala to zrobić, ale nie chcę go implementować i miałem nadzieję, że 'std :: set' jest wystarczająco dobry, aby to osiągnąć. – Qwertiy
@ Kwota w większości przypadków wstawianie do wektora będzie bardzo szybkie ze względu na lokalizację pamięci podręcznej. 'std :: set', a także listy połączone, używają wskaźników do elementów potomnych rozproszonych wszędzie, więc w wielu przypadkach może być wolniejsze. Przeczytaj [Dlaczego nigdy nie powinieneś KIEDYKOLWIEK używać kodu linków w swoim kodzie ponownie] (https://kjellkod.wordpress.com/2012/02/25/why-you-should-never-ever-ever-use- linked-list-in-your-code-again /), [Bjarne Stroustrup: Dlaczego powinieneś unikać Linked Lists] (https://youtu.be/YQs6IC-vgmo), [Are lists evil?] (https: // isocpp.org/blog/2014/06/stroustrup-lists) –