이진 검색을 사용하여 요소 의 배열을 검색하려면 최악의 경우 반복이 필요합니다. 각 단계에서 검색 공간의 절반을 잘라 내기 때문입니다. 대신 '삼항 검색'을 사용하는 경우 각 반복마다 검색 공간의 3 분의 2를 잘라내므로 최악의 경우 반복 ...
삼항 검색이 더 빠른 것 같습니다. 왜 이진 검색을 사용합니까?
이진 검색을 사용하여 요소 의 배열을 검색하려면 최악의 경우 반복이 필요합니다. 각 단계에서 검색 공간의 절반을 잘라 내기 때문입니다. 대신 '삼항 검색'을 사용하는 경우 각 반복마다 검색 공간의 3 분의 2를 잘라내므로 최악의 경우 반복 ...
삼항 검색이 더 빠른 것 같습니다. 왜 이진 검색을 사용합니까?
답변:
이진 검색을 적용하면 많은 비교가 있습니다. 삼항 검색을 적용하는 경우 각 단계에서와 같이 많은 비교가 이루어집니다. 각 단계에서 검색 공간을 세 부분으로 자르려면 2 개의 비교를 수행해야합니다. 이제 수학을 수행하면 다음을 관찰 할 수 있습니다. 우리가 알고 있기 때문에 그 , 우리가 실제로 얻을 더 삼항 검색과 비교를.
그건 그렇고 : 비교가 상당히 비싸고 병렬화 될 수있는 경우 병렬 컴퓨터가 적용될 수있는 경우 -ary 검색은 의미가 있습니다.
인수는 -ary 검색으로 매우 쉽게 일반화 될 수 있습니다. 함수 이 정수 값에 대해 엄격하게 모노톤 증가 함 을 보여 주면 됩니다.f ( k ) = ( k − 1 ) ⋅ 로그 ( 2 ) k
DCTLib은 옳지 만 잠시 수학을 잊어라.
당신의 논리에 따르면, n -ary가 가장 빠릅니다. 그러나 당신이 그것에 대해 생각하면, n -ary는 정규 반복 검색과 정확히 동일합니다 (목록을 1에서 1까지 반복하지만 역순으로). 먼저 목록에서 마지막 (또는 마지막) 항목을 선택하고 해당 값을 비교 값과 비교하십시오. 그런 다음 목록에서 해당 항목을 제거한 다음 새 목록에서 마지막 항목 (배열의 마지막 값 옆에있는)을 선택하십시오. 매번 값을 찾을 때까지 한 번에 하나의 값만 제거합니다.
대신, 당신은 이것에 대해 생각해야합니다-각 반복에서 목록에서 가장 많은 값을 어떻게 제거합니까? 이진 검색에서는 항상 목록의 절반을 제거합니다. 삼항 검색에서는 목록의 2/3를 제거 할 가능성이 있지만 (실제로는 33.33 %) 목록의 1/3 만 제거 할 가능성이 훨씬 더 높습니다 (66.66 %). O (n)을 계산하려면 최악의 시나리오 (1/3, 1/2 미만)를 살펴 봐야합니다. n에 가까워 질수록 더 나빠집니다.
이진 검색을 통해 최악의 시나리오가 개선 될뿐만 아니라 평균 시간도 향상됩니다. 예상 값 (평균적으로 목록에서 제거 할 수있는 부분)을 살펴보면 다음 공식을 사용합니다.
(P_lower) x (낮은 경우 제거 할 수있는 부분) + (P_higher) x (높은 경우 제거 할 수있는 부분) = E
이진 검색의 경우 이것은 .5x.5 + .5x.5 = .5입니다 (우리는 항상 목록의 절반을 제거합니다). 삼항 검색의 경우이 값은 .666x.333 + .333x.666 = 0.44이거나 각 단계에서 목록의 44 % 만 제거하므로 평균적으로 이진 검색보다 효율성이 떨어집니다. 이 값은 1/2 (목록의 절반)에서 정점에 도달하고 n (역 반복) 및 0 (정기 반복)에 가까워 질수록 감소합니다.
좋아, 그래서 나는 거짓말했다. 약간의 수학이 관련되어 있지만, 그것이 도움이되기를 바랍니다!
log (N) vs 2 log (N) 비교 인수는 알고리즘의 순진한 해석을 기반으로합니다. 실제로 앉아서 x86 어셈블리에 이것을 쓰면 결과가 반전됩니다. 문제는 테스트 케이스에 정수를 사용하여 중복 비교를 제거 할 수없는 불충분하게 똑똑한 컴파일러와 결합하는 것입니다. 문자열과 적절한 문자열 비교 함수로 다시 시도하고 루프 당 한 번 비교 함수를 호출하도록 코딩하면 삼항 검색이 다시 빠릅니다.