이진 검색 복잡성을 계산하는 방법


144

나는 이진 검색이 검색에 필요한 입력을 반으로 줄이므로 log (n) 알고리즘이라고 말하는 것을 들었습니다. 나는 수학 배경이 아니기 때문에 관련이 없습니다. 누군가 좀 더 자세히 설명 할 수 있습니까? 대수 시리즈와 관련이 있습니까?


1
이 당신을 도울 수 있습니다 stackoverflow.com/a/13093274/550393
2cupsOfTech에게

답변:


385

여기서는 좀 더 수학적 방법으로 볼 수 있지만 실제로는 복잡하지 않습니다. 비공식적 인 것보다 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) = (2 ^ 2) * K로 계산했습니다. 양식을 기록하는 방법?
Shan Khan

1
동일한 개념 그래픽 설명 : stackoverflow.com/a/13093274/550393
2cupsOfTech에게

내가 누락 된 부분은 7 개의 항목이있는 BST가 있다면 그 공식은 무엇입니까? log2 (7)? 가능한 모든 결과로 무차별 대입 계산을 수행하고 log2 (7)과 같지 않은 답을 얻었으므로 내가 뭘 잘못하고 있습니까?
페리 Monschau

1
이진 트리 설명보다 훨씬 쉽습니다.
NONAME

1
아주 좋은 답변
VHS

22

이진 검색의 경우 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))

출처 : http://en.wikipedia.org/wiki/Master_theorem


1
a = 1과 b = 2 일 때 log (a base b)가 1 인 이유는 0이 아니어야합니까?
GAURANG VYAS

16

T (n) = T (n / 2) +1

T (n / 2) = T (n / 4) + 1 + 1

T (n) = T (n / 4) + 1 + 1이되도록 The (n / 2)의 값을 위에 넣으십시오. . . . T (n / 2 ^ k) + 1 + 1 + 1 ..... + 1

= T (2 ^ k / 2 ^ k) + 1 + 1 .... + 1 최대 k

= T (1) + k

우리가 2 ^ k = n을 취했듯이

K = 로그 n

따라서 시간 복잡도는 O (log n)입니다


10

검색 시간이 절반이 아니므로 log (n)가되지 않습니다. 대수적으로 줄어 듭니다. 이것에 대해 잠시 생각하십시오. 테이블에 128 개의 항목이 있고 값을 선형으로 검색해야하는 경우 값을 찾으려면 평균 약 64 개의 항목이 필요합니다. 그것은 n / 2 또는 선형 시간입니다. 이진 검색을 사용하면 반복 할 때마다 가능한 항목의 1/2을 제거하여 값을 찾기 위해 최대 7 개의 비교 만 수행합니다 (128의 로그 2는 7 또는 2는 7 제곱은 128입니다). 이진 검색의 힘.


necropost는 유감이지만 128은 고르게 채워진 나무가 아닙니다. 나는이 문제를 해결하기 위해 기본 예제를 사용했으며 7 개의 항목이 3 개의 레이어로 나무를 균등하게 채운다는 것을 알았습니다. 복잡도는 17/7 (비교 총계 평균) 인 2.43이어야한다고 계산했습니다. 그러나 log2 (7)은 2.81입니다. 그래서 내가 여기서 무엇을 놓치고 있습니까?
페리 Monschau

두 가지 답변-첫 번째 답변 : 수학에 오류가 없더라도 선형에 대해 2.43 평균이 여전히 3.5 평균보다 낫다는 것을 알 수 있습니다. 이는 낮은 값입니다. 100 개의 항목에 들어가면 log2 ()가 linear보다 훨씬 낫습니다. 나는 당신이 이것을 다음에 볼 것이라고 생각합니다.
Michael Dorgan

1
두 번째 대답 : 7에 모든 것이 채워져있는 나무의 종류가 확실하지 않습니다. 8 개의 엔트리로 구성된 완벽한 트리를 생각하면 총 8 개의 잎이있는 3 단계 깊이의 트리가 보입니다. 이 트리에서 검색하는 숫자에 관계없이 루트에서 리프로 이동하는 데 총 3 번의 비교가 필요합니다. 7 개 항목의 경우 경로 중 하나가 20/7 (6 개 노드의 3 개 노드, 1 개 노드의 2 개 노드) 인 ~ 2.85보다 하나 덜 비교됩니다. Log2 (7)은 ~ 2.81입니다. .04 차이를 설명 할 수있는 수학 배경은 없지만 분수 비트나 다른 마술을 사용하지 않는 것과 관련이 있다고 생각합니다 :)
Michael Dorgan

숫자는 잎의 수입니다!? 노드의 수가 아닌가? 글쎄, 그것은 내가 놓친 큰 정보 조각이었다. 각 분기 노드가 또한 잠재적 인 정지 점일 때, 함수가 잎을 기반으로한다는 것이 이상하게 보인다. 어쨌든, 나를 위해 그것을 교정 해 주셔서 감사합니다!
페리 Monschau

5

이진 검색 알고리즘의 시간 복잡도는 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 표기법 상수를 사용하면 계산되지 않습니다.


4

다음은 위키 백과 항목

간단한 반복 접근법을 살펴보십시오. 필요한 요소를 찾을 때까지 검색 할 요소의 절반 만 제거하면됩니다.

다음은 수식을 작성하는 방법에 대한 설명입니다.

처음에 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⌋


1
더 공식적인 버전을 정확히 어떻게 얻습니까?
Kalle

플로어 기능이 사용됩니다. 자세한 내용은 답변에 제공된 위키 링크 ( en.wikipedia.org/wiki/Binary_search_algorithm ) 의 성능 섹션에 있습니다.
RajKon December


2

이진 검색의 반복이 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)

1

이진 검색은 문제를 다음과 같이 반으로 나눠서 작동합니다 (자세한 내용은 생략).

[4,1,3,8,5]에서 3을 찾는 예

  1. 품목 목록 주문 [1,3,4,5,8]
  2. 가운데 항목 (4)을보십시오.
    • 그것이 당신이 찾고있는 것이라면 멈추십시오.
    • 더 크면 전반을보십시오
    • 적 으면 후반을보십시오
  3. 새 목록 [1, 3]으로 2 단계를 반복하고 3을 찾아 중지하십시오.

그것은이다 BI 는 2 문제를 분할 할 때 -nary 검색 할 수 있습니다.

검색에는 올바른 값을 찾기 위해 log2 (n) 단계 만 필요합니다.

알고리즘 복잡성에 대해 배우려면 알고리즘 소개를 권장 합니다.


1

매번 목록을 반으로 줄이므로 목록을 두 개로 나눌 때 1을 얻는 단계 수를 알아야합니다. 아래 주어진 계산에서 x는 하나의 요소 (최악의 경우)를 얻을 때까지 목록을 나누는 횟수를 나타냅니다.

1 = N / 2x

2x = N

log2 복용

log2 (2x) = log2 (N)

x * log2 (2) = log2 (N)

x = log2 (N)


1

T (N) = T (N / 2) + 1

T (N) = T (N / 2) + 1 = (T (N / 4) + 1) + 1

...

T (N) = T (N / N) + (1 + 1 + 1 + ... + 1) = 1 + logN (기본 2 로그) = 1 + logN

따라서 이진 검색의 시간 복잡도는 O (logN)입니다.


0
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

0

예를 들어 모든 사람이 쉽게 사용할 수 있도록하겠습니다.

간단히하기 위해, 배열에 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을

따라서 증거.


0

다음은 읽을 수있는 LaTeX와 함께 마스터 정리를 사용하는 솔루션입니다.

이진 검색에 대한 반복 관계의 각 반복에 대해 런타임 T (N / 2)를 사용하여 문제를 하나의 하위 문제로 변환합니다. 따라서:

T (n) = T (n / 2) +1

마스터 정리로 대체하면 다음과 같은 이점이 있습니다.

T (n) = aT (n / b) + f (n)

이제는 로그 바0이고 f (n)은 1이므로 다음과 같은 이유로 마스터 정리의 두 번째 경우를 사용할 수 있습니다.

f (n) = O (1) = O (n0) = O (nlogba)

이것은 다음을 의미합니다.

T (n) = O (nlogbalogn) = O (n0logn) = O (logn)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.