Một sự điều chỉnh rất nhỏ để hielsnoppe's answer:
Trong một mảng -element n
(n > 0
), yếu tố để so sánh là chỉ số m = floor((n-1)/2)
. Vì vậy, có ba khả năng
A[m] < K
, sau đó sau khi so sánh, tìm kiếm tiếp tục trong một mảng kết nối n-1-m = ceiling((n-1)/2)
.
A[m] > K
, sau đó sau hai lần so sánh, tìm kiếm tiếp tục trong một mảng kết nối m
.
A[m] == K
, sau đó chúng tôi hoàn thành sau hai lần so sánh.
Vì vậy, nếu chúng ta biểu thị tối đa (trường hợp xấu nhất) số so sánh cho một tìm kiếm trong một mảng -element n
bởi C(n)
, chúng tôi có
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
Đối lẻ n = 2k+1
, sàn và trần nhà là giống hệt nhau, do đó tối đa là rõ ràng sau này,
C(2k+1) = 2 + C(k)
và thậm chí n = 2k
, chúng tôi tìm
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
Đối n = 2
, mà giải quyết để C(2) = 1 + C(1) = 1 + 2 = 3
, cho tất cả lớn hơn thậm chí n
, tối đa là 2 + C(k-1)
, vì đối với n >= 1
chúng tôi có C(n) <= C(n+1) <= C(n) + 1
.
Đánh giá đệ quy cho là người đầu tiên vài n
, chúng tôi tìm
C(0) = 0
C(1) = 2
C(2) = 3
C(3) = C(4) = 4
C(5) = C(6) = 5
C(7) = C(8) = C(9) = C(10) = 6
C(11) = ... = C(14) = 7
C(15) = ... = C(22) = 8
C(23) = ... = C(30) = 9
Vì vậy, bằng cảm ứng, chúng tôi chứng minh
C(n) = 2k, if 2^k <= n+1 < 2k + 2^(k-1), and
C(n) = 2k+1, if 2^k + 2^(k-1) <= n+1 < 2^(k+1)
hoặc
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
Đây là một chính xác trên ràng buộc.
Có lỗi trong mã của bạn: 'nếu K> A [m] thì trả về l ← m + 1' phải là' nếu K> A [m] thì l ← m + 1' mà không có 'trả về'. – Gumbo