数据结构与算法(12)Fibonacci查找

Fibonacci查找使用到的是黄金分割,改进二分法的轴点,选用黄金分割比来将查找表进行分割,逐渐迭代化简问题。之所以成为Fibonacci查找,是因为算法的实现与Fibonacci数列有着很大的关系。由于F[k] = F[k - 1] + F[k - 2]我们可以考虑将查找表分为

这里写图片描述

实现的代码

#include <stdio.h>
#include <stdlib.h>

#define LIST_SIZE 20
#define FIB_SIZE 20

typedef int KeyType;
typedef char DataType[10];
typedef struct{
    KeyType key;
    DataType data;
}Node;

typedef Node List[LIST_SIZE];

void GetFibonacci(int *Fib, int n)
{
    int i;
    Fib[0] = 1;
    Fib[1] = 1;
    for (i = 2; i < n; ++i)
        Fib[i] = Fib[i - 1] + Fib[i - 2];
}

/*
在[0, n)中查找key
*/
int FibSearch(List L, int n, KeyType key)
{
    int Fib[FIB_SIZE];
    int k, i;
    int lo = 0, hi = n - 1, mid;
    GetFibonacci(Fib, FIB_SIZE);

    k = 0;
    while (Fib[k] - 1 < n)
        k++;

    //将查找表扩充至[0, Fib[k] - 1)
    for (i = n; i < Fib[k] - 1; ++i)
        L[i].key = L[hi].key;
    hi = Fib[k] - 2;

    //查找
    while (lo <= hi){
        mid = lo + Fib[k - 1] - 1;
        if (L[mid].key == key){
            return mid;
        }
        else if (key < L[mid].key){ //大头内
            hi = mid - 1;
            k -= 1;
        }
        else{   //小头内
            lo = mid + 1;
            k -= 2;
        }
    }

    return -1;
}

int main()
{
    List L;
    KeyType key;
    KeyType a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i, n = 10;
    for (i = 0; i < n; ++i)
        L[i].key = a[i];

    printf("输入你需要查找的key: ");
    scanf("%d", &key);

    i = FibSearch(L, n, key);
    if (-1 == i){
        printf("没有找到\n");
    }
    else{
        printf("找到了key, 在%d的位置\n", i);
    }



    system("pause");
    return 0;
}

需要注意的几点:
1. 注意在大头内F[k - 1] - 1中, 和小头内F[k - 2] - 1中迭代k的递减数是不同的
2. 在将查找表分块的时候,注意要将其扩容到F[k] - 1,这样才好定位好轴点mid

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值