Podczas przeglądania http://en.cppreference.com/w/cpp/algorithm/binary_search zauważyłem, że jako argument przyjmuje iterator do przodu. Teraz jestem zdezorientowany, ponieważ myślałem, że będzie to raczej iterator dostępu losowego, więc wyszukiwarka binarna będzie faktycznie binarna.Dlaczego argumentami std :: binary_search są iteratory forward?
Aby zaspokoić moją ciekawość, pisałem trochę program:
#include <iostream>
#include <vector>
#include <forward_list>
#include <list>
#include <deque>
#include <algorithm>
#include <chrono>
#include <random>
int main()
{
std::uniform_int_distribution<int> uintdistr(-4000000, 4000000);
std::mt19937 twister(std::chrono::high_resolution_clock::to_time_t(std::chrono::high_resolution_clock::now()));
size_t arr[] = { 200000, 400000, 800000, 1600000, 3200000, 6400000, 12800000 };
for(auto size : arr)
{
std::list<int> my_list;
for(size_t i = 0; i < size; i++)
my_list.push_front(uintdistr(twister));
std::chrono::time_point<std::chrono::high_resolution_clock> start, end;
my_list.sort(); //fixed
start = std::chrono::high_resolution_clock::now();
std::binary_search(my_list.begin(), my_list.end(), 1252525);
end = std::chrono::high_resolution_clock::now();
long long unsigned elapsed_time = std::chrono::duration_cast<std::chrono::microseconds>(end-start).count();
std::cout << "Test finished in " << elapsed_time << "\n";
}
}
kompilowanie go z gcc 4.7.0 i działa
g++ -std=c++11 test.cpp
zapewnia następujące wyniki na moim komputerze:
Test finished in 0
Test finished in 15625
Test finished in 15625
Test finished in 46875
Test finished in 93750
Test finished in 171875
Test finished in 312500
Wygląda więc na to, że nie wykonuje wyszukiwania binarnego na liście do przodu. Teraz moje pytania to:
Dlaczego takie mylące imię?
Dlaczego ten kod jest dozwolony?
Dlaczego referencja mówi, że to "Logarytmiczna odległość między pierwszym a ostatnim"?
Co standard ma do powiedzenia na ten temat?
EDIT: Teraz kod sortuje listę zanim wyszukiwania - głupi błąd, teraz wyniki są następujące:
Test finished in 46875
Test finished in 109375
Test finished in 265625
Test finished in 546875
Test finished in 1156250
Test finished in 2625000
Test finished in 6375000
i oczywiście nadal nie logarytmicznej;)
Czy lista nie musi być posortowana, aby funkcja binary_search działała? – jcoder
@ J99 Dobry punkt. Niedługo zaktualizuję moje pytanie. – milleniumbug
Musi tylko wykonać porównania log (n) z kolejnymi iteratorami (i dostępem losowym). Zaletą dostępu losowego jest możliwość przeskakiwania do przodu, a nie szukania do przodu. –