답변:
여기서는 좀 더 수학적 방법으로 볼 수 있지만 실제로는 복잡하지 않습니다. 비공식적 인 것보다 IMO가 훨씬 명확합니다.
문제는 1이 될 때까지 N을 2로 몇 번 나눌 수 있습니까? 이것은 본질적으로 당신이 그것을 찾을 때까지 이진 검색 (요소의 절반)을 수행한다는 것입니다. 공식에서 이것은 다음과 같습니다.
1 = N / 2 x
2 x 곱하기 :
2 x = N
이제 로그 2를 수행하십시오 .
log 2 (2 x ) = log 2 N
x * log 2 (2) = log 2 N
x * 1 = log 2 N
즉, 모든 것이 나눌 때까지 N을 로그로 나눌 수 있습니다. 즉, 요소를 찾을 때까지 N 로그 ( "이진 검색 단계 수행")를 나누어야합니다.
이진 검색의 경우 T (N) = T (N / 2) + O (1) // 재발 관계
재귀 관계의 런타임 복잡도 계산을위한 마스터 정리 적용 : T (N) = aT (N / b) + f (N)
여기서 a = 1, b = 2 => log (a base b) = 1
또한 여기에 f (N) = n ^ c log ^ k (n) // k = 0 & c = log (기본 b)
따라서 T (N) = O (N ^ c log ^ (k + 1) N) = O (log (N))
검색 시간이 절반이 아니므로 log (n)가되지 않습니다. 대수적으로 줄어 듭니다. 이것에 대해 잠시 생각하십시오. 테이블에 128 개의 항목이 있고 값을 선형으로 검색해야하는 경우 값을 찾으려면 평균 약 64 개의 항목이 필요합니다. 그것은 n / 2 또는 선형 시간입니다. 이진 검색을 사용하면 반복 할 때마다 가능한 항목의 1/2을 제거하여 값을 찾기 위해 최대 7 개의 비교 만 수행합니다 (128의 로그 2는 7 또는 2는 7 제곱은 128입니다). 이진 검색의 힘.
이진 검색 알고리즘의 시간 복잡도는 O (log n) 클래스에 속합니다. 이것을 큰 O 표기법 이라고 합니다. 이것을 해석하는 방법은 크기 n의 입력 세트가 주어질 때 함수를 실행하는 데 걸리는 시간의 점근 적 성장을 초과하지 않는 것 log n
입니다.
이것은 진술 등을 증명할 수있는 공식적인 수학적 용어입니다. 매우 간단한 설명이 있습니다. n이 매우 커지면 log n 함수는 함수를 실행하는 데 걸리는 시간을 초과합니다. "입력 세트"의 크기 n은 목록의 길이 일뿐입니다.
간단히 말해서, 이진 검색이 O (log n)에있는 이유는 각 반복에서 입력 세트를 반으로 나누기 때문입니다. 반대 상황에서는 생각하기가 더 쉽습니다. x 반복에서 최대로 이진 검색 알고리즘이 얼마나 긴 목록을 조사 할 수 있습니까? 답은 2 ^ x입니다. 이것으로부터 우리는 이진 검색 알고리즘이 평균 길이 n의리스트에 대해 log2 n 반복을 필요로한다는 것을 반대로 알 수있다.
왜 O (log n)가 아니라 O (log2 n)가 아닌가하면, 간단히 다시 넣기 때문입니다.-큰 O 표기법 상수를 사용하면 계산되지 않습니다.
다음은 위키 백과 항목
간단한 반복 접근법을 살펴보십시오. 필요한 요소를 찾을 때까지 검색 할 요소의 절반 만 제거하면됩니다.
다음은 수식을 작성하는 방법에 대한 설명입니다.
처음에 N 개의 요소가 있고 첫 번째 시도로 ⌊N / 2⌋하는 것을 가정하십시오. 여기서 N은 하한과 상한의 합입니다. N의 첫 번째 시간 값은 (L + H)와 같습니다. 여기서 L은 첫 번째 인덱스 (0)이고 H는 검색중인 목록의 마지막 인덱스입니다. 운이 좋으면 찾으려고하는 요소가 중간에 있습니다 (예 : {16, 17, 18, 19, 20} 목록에서 18을 검색하고 ⌊ (0 + 4) / 2⌋ = 2를 계산합니다. 여기서 0은 하한입니다 (L-배열의 첫 번째 요소 색인) 4는 상한 (H-배열의 마지막 요소의 인덱스)입니다. 위의 경우 L = 0 및 H = 4입니다. 이제 2는 검색중인 요소 18의 색인입니다. 빙고! 찾았어요
사례가 다른 배열 {15,16,17,18,19}이지만 여전히 18을 검색하는 경우 운이 좋지 않으며 첫 번째 N / 2 (⌊ (0 + 4) / 2⌋ = 2이고 인덱스 2의 요소 17이 찾고자하는 숫자가 아니라는 것을 알았습니다. 이제 다음 번 반복적 인 방식으로 검색 할 때 배열의 절반 이상을 찾을 필요가 없음을 알고 있습니다. 따라서 기본적으로 이전 시도에서 찾을 수 없었던 요소를 찾으려고 시도 할 때마다 이전에 검색 한 요소 목록의 절반을 검색하지 않습니다.
최악의 경우는
[N] / 2 + [(N / 2)] / 2 + [((N / 2) / 2)] / 2 .....
즉 :
N / 2 1 + N / 2 2 + N / 2 3 + ..... + N / 2 x … ..
검색을 완료 할 때까지, 찾으려는 요소에서 목록의 끝에있는 위치.
최악의 경우는 N / 2 x에 도달했을 때입니다. 여기서 x는 2 x = N입니다.
다른 경우 N / 2 x ( 여기서 x는 2 x <N x의 최소값이 1 일 수 있음)가 가장 좋습니다.
수학적으로 최악의 경우이므로
2 x = N
=> log 2 (2 x ) = log 2 (N)
=> x * log 2 (2) = log 2 (N)
=> x * 1 = log 2 (N)
=> 더 공식적으로 ⌊log 2 (N) + 1⌋
Log2 (n)은 이진 검색에서 무언가를 찾는 데 필요한 최대 검색 수입니다. 평균 사례는 log2 (n) -1 검색과 관련이 있습니다. 자세한 정보는 다음과 같습니다.
이진 검색의 반복이 k 반복 후에 종료된다고 가정 해 봅시다. 각 반복에서 배열은 반으로 나뉩니다. 반복에서 배열의 길이가 n At Iteration 1이라고 가정 해 봅시다.
Length of array = n
반복 2에서
Length of array = n⁄2
반복 3에서
Length of array = (n⁄2)⁄2 = n⁄22
따라서 반복 k 후에
Length of array = n⁄2k
또한, 우리는 K 개의 분할 후 후에 알고 배열의 길이가 1이된다 따라서
Length of array = n⁄2k = 1
=> n = 2k
양쪽에 로그 기능 적용 :
=> log2 (n) = log2 (2k)
=> log2 (n) = k log2 (2)
As (loga (a) = 1)
따라서,
As (loga (a) = 1)
k = log2 (n)
따라서 이진 검색의 시간 복잡성은
log2 (n)
이진 검색은 문제를 다음과 같이 반으로 나눠서 작동합니다 (자세한 내용은 생략).
[4,1,3,8,5]에서 3을 찾는 예
그것은이다 BI 는 2 문제를 분할 할 때 -nary 검색 할 수 있습니다.
검색에는 올바른 값을 찾기 위해 log2 (n) 단계 만 필요합니다.
알고리즘 복잡성에 대해 배우려면 알고리즘 소개를 권장 합니다.
ok see this
for(i=0;i<n;n=n/2)
{
i++;
}
1. Suppose at i=k the loop terminate. i.e. the loop execute k times.
2. at each iteration n is divided by half.
2.a n=n/2 .... AT I=1
2.b n=(n/2)/2=n/(2^2)
2.c n=((n/2)/2)/2=n/(2^3)....... aT I=3
2.d n=(((n/2)/2)/2)/2=n/(2^4)
So at i=k , n=1 which is obtain by dividing n 2^k times
n=2^k
1=n/2^k
k=log(N) //base 2
예를 들어 모든 사람이 쉽게 사용할 수 있도록하겠습니다.
간단히하기 위해, 배열에 32 개의 요소가 정렬 된 순서로 있다고 가정하고이 중 검색을 사용하여 요소를 검색합니다.
12 34 5 6 ... 32
32를 검색한다고 가정합니다. 첫 번째 반복 후에는
17 18 19 20 .... 32
두 번째 반복 후에는
25 26 27 28 .... 32
세 번째 반복 후에는
29 30 31 32
네 번째 반복이 끝나면
31 32
다섯 번째 반복에서는 값 32를 찾을 수 있습니다.
따라서 이것을 수학 방정식으로 변환하면
(32 X (1/2 5 )) = 1
=> n X (2 -k ) = 1
=> (2 k ) = n
=> 로그 K 2 = 2 로그 2 N을
=> K = 로그 2 N을
따라서 증거.