피보나치 검색

Harshit Jindal 2023년10월12일
  1. 피보나치 검색 알고리즘
  2. 피보나치 검색 예
  3. 피보나치 검색 알고리즘 구현
  4. 피보나치 검색 알고리즘 복잡성
피보나치 검색

피보나치 검색은 효율적인 간격 검색 알고리즘입니다. 분할 및 정복 전략을 기반으로하며 배열도 필요하다는 점에서 이진 검색과 유사합니다. 정렬됩니다. 더욱이 두 알고리즘의 시간 복잡도는 로그입니다. 피보나치 수열을 활용하기 때문에 피보나치 검색이라고합니다. (현재 숫자는 두 전임자의 합계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보다 크면 다음을 수행합니다.
    • Xfib(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)=5fib(m-2)=3이됩니다.
  • 첫 번째 반복
    • 요소의 인덱스를min(-1 + 3, 6)로 계산하여 요소를A[2] = 3으로 지정합니다.
    • 3<6즉,A[2]<X따라서A[0 .... 2]를 버리고offset2로 설정합니다.
    • 또한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]를 버리고offset4로 설정합니다.
    • 또한 피보나치 수열을 업데이트하여fib(m-2)1로,fib(m-1)2로,fib(m)3으로 이동합니다.
  • 세 번째 반복
    • 요소의 인덱스를min(4 + 1, 6)로 계산하여 요소를A[5] = 6으로 지정합니다.
    • 6==6A[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 avatar Harshit Jindal avatar

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

관련 문장 - Search Algorithm