피보나치 검색
피보나치 검색은 효율적인 간격 검색 알고리즘입니다. 분할 및 정복 전략을 기반으로하며 배열도 필요하다는 점에서 이진 검색과 유사합니다. 정렬됩니다. 더욱이 두 알고리즘의 시간 복잡도는 로그입니다. 피보나치 수열을 활용하기 때문에 피보나치 검색이라고합니다. (현재 숫자는 두 전임자의 합계F[i] = F[i-1] + F[i-2]
,F[0]
= 0
&F[1]
=1
은 연속 된 처음 두 숫자입니다.) 배열을 피보나치 숫자로 주어진 크기로 두 부분으로 나눕니다. 이진 검색에 필요한 나누기, 곱하기 및 비트 시프트에 비해 더하기 및 빼기 연산 만 사용하는 계산 친화적 인 방법입니다.
피보나치 검색 알고리즘
n
요소를 포함하는 정렬되지 않은 배열A[]
가 있다고 가정하고,X
요소를 찾으려고합니다.
-
배열
n
보다 크거나 같은 가장 작은 피보나치 수를 찾습니다. 이 숫자를 mth 피보나치 숫자fib(m)
과 그 이전 숫자fib(m-1)
및fib(m-2)
로 지정합니다. -
오프셋을
-1
로 초기화합니다. -
fib(m-2)
가0
보다 크면 다음을 수행합니다.X
를fib(m-2)
에 포함 된 마지막 요소와 비교합니다.A[min (offset + fib (m-2), n-1)]
로 지정됩니다.X
가이 요소와 같으면 색인을 반환합니다.- 그렇지 않으면
X
가이 요소보다 작 으면이 요소 뒤의 절반을 버리고 피보나치 수열을 두 단계 뒤로 이동합니다. 또한 오프셋을 업데이트하여 검색 공간의 시작 색인을 변경하십시오. 이 단계는 어레이 검색 공간의 뒤쪽 2/3를 버립니다. - 그렇지 않으면
X
가이 요소보다 크면이 요소 앞의 절반을 버리고 피보나치 수열을 한 단계 뒤로 이동합니다. 이 단계는 배열 검색 공간의 앞쪽 1/3을 버립니다.
-
fib(m-1)
이1
과 같으면 하나의 요소를 선택하지 않은 상태로 남겨두고X
와 비교합니다.X
가이 요소와 같으면 색인을 반환합니다. -
일치하는 요소가 없으면
-1
을 반환합니다.
피보나치 검색 예
배열이 있다고 가정합니다: (1, 2, 3, 4, 5, 6, 7)
. X
= 6 요소를 찾아야합니다.
배열에는 7 개의 요소가 있습니다. 따라서n
= 7.n
보다 큰 가장 작은 피보나치 수는 8입니다.
-
fib(m)
=8
,fib(m-1)
=5
및fib(m-2)
=3
이됩니다. -
첫 번째 반복
- 요소의 인덱스를
min(-1 + 3, 6)
로 계산하여 요소를A[2] = 3
으로 지정합니다. 3
<6
즉,A[2]
<X
따라서A[0 .... 2]
를 버리고offset
을2
로 설정합니다.- 또한
fib(m-2)
를2
로,fib(m-1)
을3
으로fib(m)
을5
로 이동하도록 피보나치 수열을 업데이트합니다.
- 요소의 인덱스를
-
두 번째 반복
- 요소의 인덱스를
min(2 + 2, 6)
로 계산하여 요소를A[4] = 5
로 지정합니다. 5
<6
즉,A[4]
<X
따라서A[2 .... 4]
를 버리고offset
을4
로 설정합니다.- 또한 피보나치 수열을 업데이트하여
fib(m-2)
를1
로,fib(m-1)
을2
로,fib(m)
을3
으로 이동합니다.
- 요소의 인덱스를
-
세 번째 반복
- 요소의 인덱스를
min(4 + 1, 6)
로 계산하여 요소를A[5] = 6
으로 지정합니다. 6
==6
즉A[5]
==X
, 인덱스5
를 반환합니다.
- 요소의 인덱스를
피보나치 검색 알고리즘 구현
#include <bits/stdc++.h>
using namespace std;
int fibonacciSearch(int A[], int x, int n) {
int fbM2 = 0;
int fbM1 = 1;
int fbM = fbM2 + fbM1;
int offset = -1;
while (fbM < n) {
fbM2 = fbM1;
fbM1 = fbM;
fbM = fbM2 + fbM1;
}
while (fbM > 1) {
int i = min(offset + fbM2, n - 1);
if (A[i] < x) {
fbM = fbM1;
fbM1 = fbM2;
fbM2 = fbM - fbM1;
offset = i;
} else if (A[i] > x) {
fbM = fbM2;
fbM1 = fbM1 - fbM2;
fbM2 = fbM - fbM1;
} else
return i;
}
if (fbM1 && A[offset + 1] == x) return offset + 1;
return -1;
}
int main() {
int n = 9;
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int x = 8;
int result = fibonacciSearch(arr, x, n);
if (result == -1) {
cout << "Element not found !!";
} else
cout << "Element found at index " << result;
return 0;
}
피보나치 검색 알고리즘 복잡성
시간 복잡성
- 평균 사례
우리는 모든 반복에서 검색 공간을 1/3 / 2/3만큼 줄이므로 알고리즘은 로그 복잡성을 갖습니다. 피보나치 검색 알고리즘의 시간 복잡도는O(logn)
입니다.
- 베스트 케이스
최상의 경우 시간 복잡도는O(1)
입니다. 검색 할 요소가 우리가 비교할 첫 번째 요소 일 때 발생합니다.
- 최악의 경우
최악의 경우는 대상 요소X
가 항상 더 큰 하위 배열에있을 때 발생합니다. 최악의 시간 복잡도는O(logn)
입니다. 평균 케이스 시간 복잡성과 동일합니다.
공간 복잡성
이 알고리즘의 공간 복잡도는 임시 변수 이외의 추가 공간이 필요하지 않기 때문에O(1)
입니다.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn