Trong khi thử sử dụng http://en.cppreference.com/w/cpp/algorithm/binary_search Tôi đã nhận thấy nó cần chuyển tiếp trình lặp làm đối số. Bây giờ tôi đang bối rối, vì tôi nghĩ rằng nó sẽ là một iterator truy cập ngẫu nhiên, do đó, tìm kiếm nhị phân sẽ được thực sự nhị phân.Tại sao các đối số của std :: binary_search là các trình vòng lặp chuyển tiếp?
Để thỏa mãn sự tò mò của tôi, tôi đã viết một chương trình nhỏ:
#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";
}
}
Biên soạn nó với gcc 4.7.0 và chạy
g++ -std=c++11 test.cpp
cung cấp kết quả như sau trên máy tính của tôi:
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
Vì vậy, có vẻ như nó không thực sự thực hiện tìm kiếm nhị phân trên danh sách chuyển tiếp. Bây giờ câu hỏi của tôi là:
Tại sao một cái tên khó hiểu như vậy?
Tại sao mã như thế này được phép?
Tại sao tham chiếu cho biết đó là "Lôgarit trong khoảng cách giữa đầu tiên và cuối cùng"?
Tiêu chuẩn phải nói gì về nó?
EDIT: Bây giờ mã sắp xếp các danh sách trước khi tìm kiếm - sai lầm ngu ngốc, bây giờ kết quả là:
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
Và tất nhiên vẫn không logarit;)
Danh sách không phải được sắp xếp để binary_search hoạt động không? – jcoder
@ J99 Điểm tốt. Tôi sẽ sớm cập nhật câu hỏi của tôi. – milleniumbug
Nó vẫn chỉ cần làm các phép so sánh log (n) với các trình vòng lặp chuyển tiếp (và truy cập ngẫu nhiên). Ưu điểm của truy cập ngẫu nhiên là khả năng nhảy về phía trước thay vì tìm kiếm về phía trước. –