Có và không. Có, tìm kiếm nhanh hơn, trung bình hơn là tìm kiếm chia đôi. Nhưng tôi tin rằng họ vẫn là O (lg N), chỉ với một hằng số thấp hơn.
Bạn muốn giảm thiểu thời gian cần tìm để tìm phần tử của bạn. Nói chung, nó là mong muốn sử dụng ít bước hơn, và một cách để tiếp cận điều này là để tối đa hóa số lượng dự kiến của các yếu tố sẽ được loại bỏ ở mỗi bước. Với bisection, luôn luôn chính xác một nửa các yếu tố được loại bỏ. Bạn có thể làm tốt hơn điều này, NẾU bạn biết điều gì đó về sự phân bố của các nguyên tố. Tuy nhiên, thuật toán để chọn phần tử phân vùng thường phức tạp hơn việc chọn điểm giữa, và độ phức tạp thêm này có thể áp đảo bất kỳ khoản tiết kiệm thời gian nào bạn mong đợi nhận được từ việc sử dụng ít bước hơn.
Thực sự, trong một vấn đề như thế này tốt hơn là tấn công các hiệu ứng bậc hai như vùng nhớ đệm, hơn là thuật toán tìm kiếm. Ví dụ, khi thực hiện tìm kiếm nhị phân lặp lại, cùng một vài phần tử (thứ nhất, thứ hai và thứ ba phần tư) được sử dụng RẤT thường xuyên, vì vậy đặt chúng trong một dòng bộ nhớ cache duy nhất có thể vượt trội hơn so với truy cập ngẫu nhiên vào danh sách.
Chia mỗi cấp thành 4 hoặc 8 phần bằng nhau (thay vì 2) và thực hiện tìm kiếm tuyến tính thông qua tìm kiếm tuyến tính cũng nhanh hơn tìm kiếm chia đôi, vì tìm kiếm tuyến tính không yêu cầu tính phân vùng và cũng có ít hơn phụ thuộc dữ liệu có thể gây ra các bộ nhớ cache.
Nhưng tất cả những điều này vẫn là O (lg N).
Nguồn
2010-10-30 04:46:30
Nếu bạn có máy tính lượng tử, bạn có thể thử http://en.wikipedia.org/wiki/Grover%27s_algorithm :) –
@David: Danh sách được sắp xếp, do đó thuật toán của Grover tệ hơn tìm kiếm chia đôi. O (sqrt N)> O (lg N) –
máy trạng thái làm việc theo thứ tự độ lớn đối với tôi trên dữ liệu lớn, nhưng độ phức tạp/bộ nhớ cho các trạng thái xây dựng lớn hơn nhiều so với sắp xếp. – technosaurus