数据结构与算法(12)Fibonacci查找
来源:互联网 发布:c语言标准库函数时间 编辑:程序博客网 时间:2024/05/29 11:49
Fibonacci查找使用到的是黄金分割,改进二分法的轴点,选用黄金分割比来将查找表进行分割,逐渐迭代化简问题。之所以成为Fibonacci查找,是因为算法的实现与Fibonacci数列有着很大的关系。由于F[k] = F[k - 1] + F[k - 2]我们可以考虑将查找表分为
实现的代码
#include <stdio.h>#include <stdlib.h>#define LIST_SIZE 20#define FIB_SIZE 20typedef 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
0 0
- 数据结构与算法(12)Fibonacci查找
- 数据结构与算法(二分查找算法)
- 数据结构与算法:查找
- 数据结构与算法(查找)1
- 数据结构与算法(9)顺序查找
- 数据结构与算法(10)二分查找
- 数据结构与算法-折半查找(二分查找)
- <数据结构与算法>二分查找(折半查找)
- Fibonacci查找算法
- 【算法与数据结构】三分查找
- 【算法与数据结构】三分查找
- 数据结构与算法-顺序查找
- 【数据结构与算法】顺序查找
- 【数据结构与算法】二分查找
- 【数据结构与算法】【查找】基本概念
- 数据结构与算法------线性查找
- 数据结构与算法------二分查找
- 【数据结构与算法】二分查找
- 回归测试简介
- jquery为select添加option的代码探讨
- android事件分发那些事~
- Spring与Quartz的整合实现定时任务调度
- 【低功耗架构开发系列】(一)云服务选型
- 数据结构与算法(12)Fibonacci查找
- 小探正则
- C#数组的合并拆分
- Qt在Windows下的三种编程环境搭建
- 在页面上生成二维码
- oracle锁
- Leetcode - String - 383. Ransom Note(水题)
- HDU-1062-Text Reverse(细节题)
- php-curl(模拟post,设置header,接收json数据)