DCTLib đúng, nhưng quên toán học trong một giây.
Theo logic của bạn sau đó, n -ary nên là nhanh nhất. Nhưng nếu bạn nghĩ về nó, n -ary chính xác bằng một tìm kiếm lặp thông thường (chỉ lặp qua danh sách 1 trên 1, nhưng theo thứ tự ngược lại). Trước tiên, bạn chọn mục cuối cùng (hoặc bên cạnh cuối cùng) trong danh sách và so sánh giá trị đó với giá trị so sánh của bạn. Sau đó, bạn xóa mục đó khỏi danh sách của bạn, rồi chọn mục cuối cùng trong danh sách mới, đây chỉ là mục tiếp theo của giá trị cuối cùng trong mảng. Mỗi lần, bạn sẽ chỉ loại bỏ 1 giá trị tại một thời điểm cho đến khi bạn tìm thấy giá trị của mình.
Thay vào đó, bạn nên nghĩ về nó như thế này - làm cách nào để loại bỏ hầu hết các giá trị khỏi danh sách mỗi lần lặp? Trong một tìm kiếm nhị phân, bạn luôn loại bỏ một nửa danh sách. Trong một tìm kiếm tạm thời, có khả năng (thực tế là 33,33%) rằng bạn có thể loại bỏ 2/3 danh sách, nhưng có một cơ hội thậm chí còn lớn hơn (66,66%) rằng bạn sẽ chỉ loại bỏ 1/3 danh sách. để tính O (n), bạn cần xem xét trường hợp xấu nhất là 1/3, dưới 1/2. Khi bạn càng ngày càng gần n, nó càng trở nên tồi tệ hơn.
Không chỉ trường hợp xấu nhất sẽ được cải thiện với tìm kiếm nhị phân, mà thời gian trung bình của bạn cũng sẽ được cải thiện. Nhìn vào giá trị mong đợi (trung bình chúng ta có thể loại bỏ phần nào của danh sách), chúng tôi sử dụng công thức này:
(P_lower) x (phần chúng ta có thể xóa nếu thấp hơn) + (P_higher) x (phần chúng ta có thể xóa nếu cao hơn) = E
Đối với tìm kiếm nhị phân, đây là .5x.5 + .5x.5 = .5 (chúng tôi luôn xóa một nửa danh sách). Đối với các tìm kiếm ternary, giá trị này là .666x.333 + .333x.666 = 0.44 hoặc ở mỗi bước, chúng tôi sẽ chỉ loại bỏ 44% danh sách, làm cho nó kém hiệu quả hơn so với tìm kiếm nhị phân, trung bình. Giá trị này đạt cực đại ở mức 1/2 (một nửa danh sách) và giảm khi bạn càng gần n (lặp lại) và 0 (lặp thường xuyên).
Ok, vì vậy tôi đã nói dối..có một chút toán học liên quan, nhưng tôi hy vọng điều đó có ích!