一 费氏查找
使用费氏数列 1 1 2 3 5 8 13 构成的数列,切割范围来进行查找
public class FSearch
{
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 数据数组
public static int Counter = 1; // 计数器
public static void main(String args[])
{
int FinA; // 费氏数
FinA = 1; // 定义费氏数
while (Fib(FinA) <= Max)
FinA++;
int KeyValue = 32;
// 调用费氏查找
if (FibonacciSearch(FinA, KeyValue))
{
// 输出查找次数
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 输出没有找到数据
System.out.println("");
System.out.println("No Found!!");
}
}
// ---------------------------------------------------
// 递归求费氏级数
// ---------------------------------------------------
public static int Fib(int N)
{
if (N <= 1) // 递归结束条件
return N;
else
return Fib(N - 1) + Fib(N - 2); // 递归执行部分
}
// ---------------------------------------------------
// 费氏查找法
// ---------------------------------------------------
public static boolean FibonacciSearch(int n, int KeyValue)
{
int Root; // 左边界变量
int Distance_1; // 上一个费氏数
int Distance_2; // 上二个费氏数(差值)
int Temp; // 数据暂存变量
Root = Fib(n - 1);
Distance_1 = Fib(n - 2);
Distance_2 = Fib(n - 3);
do
{
if (KeyValue < Data[Root - 1]) // 欲查找值较小
{ // 查找前半段
Root = Root - Distance_2;
Temp = Distance_1;
Distance_1 = Distance_2;
Distance_2 = Temp - Distance_2;
}
// 欲查找值较大
else if (KeyValue > Data[Root - 1])
{ // 查找后半段
Root = Root + Distance_2;
Distance_1 = Distance_1 - Distance_2;
Distance_2 = Distance_2 - Distance_1;
}
else if (KeyValue == Data[Root - 1]) // 查找到数据
{
System.out.println("Data[" + (Root - 1) + "] = "
+ Data[Root - 1]);
return true;
}
Counter++;
} while (Distance_2 >= 0);
return false;
}
}
运行结果:
Data[5] = 32
Search Time = 5
二 插补查找
类似于折半查找,不同的是插补查找使用的是按照比例来选择对比项
public class ISearch
{
public static int Max = 20;
public static int[] Data = { 12, 16, 19, 22, 25, 32, 39, 48, 55, 57, 58,
63, 68, 69, 70, 78, 84, 88, 90, 97 }; // 数据数组
public static int Counter = 1; // 计数器
public static void main(String args[])
{
int KeyValue = 32;
// 调用插补查找
if (InterpolationSearch(KeyValue))
{
// 输出查找次数
System.out.println("");
System.out.println("Search Time = " + (int) Counter);
}
else
{
// 输出没有找到数据
System.out.println("");
System.out.println("No Found!!");
}
}
// ---------------------------------------------------
// 插补查找法
// ---------------------------------------------------
public static boolean InterpolationSearch(int KeyValue)
{
int Low; // 插补查找法左边界变量
int High; // 插补查找法右边界变量
int Middle; // 插补查找法中间数
Low = 0;
High = Max - 1;
Middle = Low + (KeyValue - Data[Low]) * (High - Low)
/ (Data[High] - Data[Low]);
if (Middle < Low)
Middle = Low;
if (Middle > High)
Middle = High;
while (Low <= High)
{
if (KeyValue < Data[Middle]) // 欲查找值较小
High = Middle - 1; // 查找前半段
// 欲查找值较大
else if (KeyValue > Data[Middle])
Low = Middle + 1; // 查找后半段
// 查找到数据
else if (KeyValue == Data[Middle])
{
System.out.println("Data[" + Middle + "] = " + Data[Middle]);
return true;
}
if (Low < High)
Middle = Low + (KeyValue - Data[Low]) * (High - Low)
/ (Data[High] - Data[Low]);
if (Middle < Low)
Middle = Low;
if (Middle > High)
Middle = High;
Counter++;
}
return false;
}
}
运行结果:
Data[5] = 32
Search Time = 2
原文网址:
http://blog.csdn.net/myjava_024/archive/2008/11/19/3335548.aspx
分享到:
相关推荐
二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的log值,这边要介绍的费氏搜寻,其利用费氏数列作为间隔来搜寻下一个数,所以区间收敛的速度更快,搜寻时间为O(logn...
本文档详细的说明了费氏树的创建和费氏查找中的一些关键概念,对于什么是费氏查找而理清思路!
经典问题算法的Java实现/河内塔、费氏数列、Pascal三角形、选择插入气泡排序、快速排序、合并排序、二分查找等。
详细介绍了java中应用到的各类经典算法河内塔 费式数列 排序方法Shell 排序法 - 改良的插入排序 Shaker 排序法 - 改良的气泡排序 Heap 排序法 - 改良的选择排序 快速排序法(一) 快速排序法(二) 快速排序法...
以下算法均用C语言实现,代码可运行 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题...
常见的搜索算法包括线性搜索、二分搜索等。 图算法:图算法用于处理图结构的数据,如最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Prim算法、Kruskal算法)等。 动态规划:动态规划是...
Java和C语言实现各种经典算法(含代码图例) 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包...
费氏数列算法 整个工程文件下载,欢迎大家分享
插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体...
插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言...
基数排序法 102 42.Algorithm Gossip: 循序搜寻法(使用卫兵) 104 43.Algorithm Gossip: 二分搜寻法(搜寻原则的代表) 106 44.Algorithm Gossip: 插补搜寻法 109 45.Algorithm Gossip: 费氏搜寻法 ...
• 插补搜寻法 • 费氏搜寻法 矩阵 • 稀疏矩阵 • 多维矩阵转一维矩阵 • 上三角、下三角、对称矩阵 • 奇数魔方阵 • 4N 魔方阵 • 2(2N+1) 魔方阵 堆栈、队列 • 堆栈 - 使用数组实作 • 堆栈 - ...
费氏搜寻使用费氏数列来决定下一个数的搜寻位置,所以必须先制作费氏数列,这在之前有提过;费氏搜寻会先透过公式计算求出第一个要搜寻数的位置,以及其代 表的费氏数,以搜寻对象10个数字来说,第一个费氏数经计算...
4 第三课 各个击破法: Strassen 算法,费氏数列,多项式乘法。 阅读:28 章第 2 节,30章第1节 5 演示课 2 递归公式,松散性 阅读:Akra-Bazzi 的讲义 6 第四课 快速排序法,随机化算法 阅读:5 章 1 到 3 节,7 ...
介绍经典ACM算法,包括费氏数列、杨辉三角、三色旗、八皇后、生命游戏等五十余种算法及实现。
经典算法.pdf 算法举例详解 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem) 数、运算 ...
插补搜寻法 费氏搜寻法 矩阵 稀疏矩阵 多维矩阵转一维矩阵 上三角、下三角、对称矩阵 奇数魔方阵 4N 魔方阵 2(2N+1) 魔方阵 堆叠、伫列 堆叠 - 使用阵列实作 堆叠 - 使用链结实作(C 语言动态记忆体...
费氏链霉菌HTP6分批发酵动力学研究,张新刚,侯太平,对费氏链霉菌HTP6产新霉素的分批发酵动力学进行了研究,并建立了动力学模型。对数生长期最大比生长速率μm为0.0866 h-1,产物合成期最�
C语言经典算法大全 老掉牙 河内塔 费式数列 巴斯卡三角形 三色棋 老鼠走迷官(一) 老鼠走迷官(二) 骑士走棋盘 八个皇后 八枚银币 生命游戏 字串核对 双色、三色河内塔 背包问题(Knapsack Problem...