이진 검색 기술의 경우 목록은 동일한 부분으로 나뉩니다. 보간 검색 기술의 경우 절차는 보간 공식을 사용하여 정확한 위치를 찾으려고 시도합니다. 예상 위치를 찾은 후 해당 위치를 사용하여 목록을 분리할 수 있습니다. 매번 정확한 위치를 찾으려 하므로 검색 시간이 줄어듭니다. 이 기술은 항목이 균일하게 분포되어 있으면 항목을 쉽게 찾을 수 있습니다.
보간 검색 기법의 복잡성
-
시간 복잡도:O(log2 (로그2 n)) 평균 경우, O(n) 최악의 경우(항목이 기하급수적으로 분포되는 경우)
-
공간 복잡도:O(1)
Input − 정렬된 데이터 목록10 13 15 26 28 50 56 88 94 127 159 356 480 567 689 699 780 850 956 995. 위치에서 검색 키:780Output − 1 항목을 찾았습니다.알고리즘
보간검색(배열, 시작, 끝, 키)
입력 :정렬된 배열, 시작 및 종료 위치, 검색 키
출력 :키의 위치(발견된 경우), 그렇지 않으면 잘못된 위치입니다.
시작하는 동안 시작 <=종료 AND 키>=배열[시작] AND 키 <=배열[끝] do dist :=키 – 배열[시작] valRange :=배열[끝] – 배열[시작] 분수 :=dist / valRange indexRange :=end – 추정 시작 :=start + (fraction * indexRange) if array[estimate] =key then return 추정 위치 if array[estimate]예시 코드
#includenamespace std;int interpolationSearch(int array[], int start, int end, int key) 사용 { int dist, valRange, indexRange, Estimate; 부동 소수점 분수; while(시작 <=끝 &&키>=배열[시작] &&키 <=배열[끝]) { dist =키 - 배열[시작]; valRange =배열[종료] - 배열[시작]; //값의 범위 분수 =dist / valRange; indexRange =끝 - 시작; 추정치 =시작 + (분수 * indexRange); // 키의 추정 위치 if(array[estimate] ==key) return 추정; if(배열[추정] <키) 시작 =추정치 +1; 그렇지 않으면 끝 =추정치 - 1; } return -1;}int main() { int n, searchKey, loc; cout <<"항목 수를 입력하세요:"; 신>> n; 정수 [n]; //크기가 n인 배열 생성 cout <<"항목 입력:" < > arr[i]; } cout <<"목록에서 검색할 검색키를 입력하세요:"; 신>> 검색 키; if((loc =interpolationSearch(arr, 0, n-1, searchKey))>=0) cout <<"위치에서 항목을 찾았습니다. " < 출력
항목 수 입력:20항목 입력:10 13 15 26 28 50 56 88 94 127 159 356 480 567 689 699 780 850 956995위치에서 검색하려면 검색 키를 입력하세요.