斐波那契查找算法的改进
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
令 mid = Fj - 1 ; f1 = Fj - 2 ; f2 = Fj - 3 ; ( 1) 若 ST [mid]= = Key; 则查找成功,返回。 ( 2) 若 ST [mid] < Key ; 则在有序表未查找区间的前段查 图 1 n = Fj - 1 时查找表的分治图 找,此时,前段区间的元素个数恰好为 Fj - 1 - 1,若元素个数 < 1,则查找失败; 否则下一比较元素的位序 为: mid = mid - f2; 修正 f1 ,f2 使得: t = f1 - f2 ; f1 = f2 ; f2 = t ; ( 3) 若 ST [mid] > Key; 则在有序表未查找区间的 后段查找,此时,后段区间的元素个数恰好为 Fj - 2 - 1,若元素个数 < 1,则查找失败; 否则下一比较 元素的位序为: mid = mid + f2 ; 修正 f1,f2 使得: f1 = f1 - f2 ; f2 = f2 - f1 ; 重复( 1) 、( 2) 、( 3) ,直至成功或失败。 斐波那契查找算法如下: int FibSearch1 ( int * ST,int n,int key,int * fib) {
契查找的平均性能优于二分查找。实验数据表明,斐波那契查找算法大约较二分查找算法快 17% 。
参考文献
[1] 严蔚敏,吴伟民. 数据结构[M]. 北京: 清华大学出版社,1997: 218 - 238. [2] 严蔚敏,吴伟民. 数据结构题集[M]. 北京: 清华大学出版社,1999: 55. [3] 齐得昱. 数据结构与算法[M]. 北京: 清华大学出版社,2003: 275 - 279. [4] Horrowitz E,Sahni S. Fundamentals of Data Structures [M]. California: Pitmen Publishing Limited,1976: 335 - 341. [5] Subasi M,Yildirim N,Yildiz B. An improvement on Fibonacci search method in optimization theory [J]. Applied Math-
三项起,每一项都等于前两项之和,即: F j = F j - 1 + F j - 2 。它的通项公式是:
( ( ) ( ) ) an
=1 槡5
n
n
1 + 槡5 - 1 - 槡5
2
2
n = 1,2,3…
( 1)
式中,虽含有对无理数的运算,但对任一个正整数 n,结果都是整数。
以下是求斐波那契序列的 c 语言函数:
找的 mid 是 5,( 对应编号中的 Fj - 1 等于 8) 。相当于在最前端补足了 3 个虚结点,就对应编号而言还原 成查找表中元素个数等于 Fj -1时的情形。
2 斐波那契查找算法的修正
但算法 1 在查找表中元素个数不等于 Fj - 1 时有误! 当下标 mid ≤ 0 时,结点为虚结点。但 mid ≤ 0 不是结束的充分条件。以图 2( b) 为例,当查找的 key 为 a1 时,在算法 1 中 mid 的初值为 5,因 key < a5 ,mid 值修正为 2,因 key < a2 ,mid 值再被修正为 0,由于 0 号单元是虚结点,算法以失败的结果结束 了查找。
第3 期
王立波: 斐波那契查找算法的改进
57
else { mid = mid - f2; t = f1 - f2; f1 = f2; f2 = t; while( mid < 1 && f1 > 1) { / / 在右子树中查找到一个实结点或查找至最右 mid = mid + f2; f1 = f1 - f2; f2 = f2 - f1; }
ematics and Computation,2004,147( 3) : 893 - 901.
The Improvements of Fibonacci Search Algorithm
WANG Li-bo
( Institute of Software and Intelligent Technology,Hangzhou Zhejiang 310018,China) Abstract: In this paper,we propose a method,which uses Fibonacci sequences,to realize the process of di-
void FibonacciSeq ( int n,int * fib)
{ / /求 n 项斐波那契数列
fib[0]= 0;
fib[1]= 1;
for ( int i = 2; i < n; i + + )
收稿日期:2010 - 06 - 28 作者简介:王立波( 1962 - ) ,男,浙江宁波人,副教授,计算机软件.
第3 期
王立波: 斐波那契查找算法的改进
55
fib[i]= fib[i - 1] + fib[i - 2]; }
1. 2 斐波那契查找
如何利用斐波那契数列对有序表进行有效分割? 以下分两种情形讨论。
1. 2. 1 当查找表中元素个数 n 等于 Fj - 1 时
当查找表中元素个数恰好为某一斐波那契数列值减 1 时, 对于关键字 Key 的查找,斐波那契查找算法的分治策略如图 1 所示,即:
} … 算法 2 在另一些教材[3]中,若查找表中元素个数 n 不等于任一斐波那契数列值减 1 时,采用在最后端补足 Fj - n - 1 个虚结点,使得加上虚结点后的元素个数仍为 Fj - 1。此时的操作虽然避免了算法 1 的错误, 但可能导致内存泄漏,结果更不足取。
3 结束语
可以证明,含有 n 个结点的斐波那契判定树其最大深度 hn = log"( 槡5( n + 1) ) - 2 。 [1,4]
其中: " = ( 1 + 槡5) /2。此时,斐波那契查找判定树的高度大于二分查找判定树的高度,由于与斐波
那契数列紧密相关的一个重要极限 lim Fn F n - > ∞ n + 1
=
槡5 - 2
1≈0.
618(
斐波那契判定树左右子树元素个数比)
恰
好是黄金分割比,且斐波那契查找算法在分割时中只须做加、减法运算而无须做乘法运算,因此,斐波那
int j,mid,f1,f2,t ; bool found; j = 2; while ( fib[j] < = n ) j + + ; / / 取一大于 n 且距 n 最近的斐波那契值 fib[j] mid = n - fib[j - 2]+ 1; f1 = fib[j - 2]; f2 = fib[j - 3]; found = false;
第 31 卷第 3 期 2011 年 06 月
杭州电子科技大学学报
Journal of Hangzhou Dianzi University
Vol. 31,No. 3 Jun. 2011
斐波那契查找算法的改进
王立波
( 杭州电子科技大学 软件与智能技术研究所,浙江 杭州 310018)
摘要:该文讨论了分治查找的斐波那契算法,描述了利用斐波那契数列对有序表进行分割、查找的
while ( mid > 0 && ! found ) {
if ( key = = ST[mid])
found = true;
/ / 找到待查元素
else if ( key < ST[mid ]) { / / 在有序表未查找区间的前段查找
if ( ! f2 ) mid = 0;
else {
mid = mid - f2;
显然,key 存在于查找表中,算法不应以失败的查找而结束。究其失败的原因是算法 1 在遇到虚结 点时不再继续查找下去,但却忽略了此时右子树中仍有可能存在实结点。
经修改后在有序表未查找区间前段查找的过程如下: … else if ( k < ST[mid]) { / / 在有序表未查找区间的前段查找 if ( ! f2 ) mid = 0;
viding and searching in an order table after discussing the Fibonacci algorithm. Several mistakes of Fibonacci algorithm description in existing teaching material have been found. The improved Fibonacci algorithm has been provided in the paper. Also,the validity and robustness of the improved algorithm by theory and experiment has been verified. Key words: binary search; Fibonacci sequence; Fibonacci search
过程,发现了现有教材中在描述斐波那契查找算法时的错误和不足,提出了自己的算法改进方法
并给出了修正后的斐波那契查找算法,验证了改进斐波那契查找算法的正确性和鲁棒性。
关键词:二分查找; 斐波那契数列; 斐波那契查找
中图分类号:TN401
文献标识码:A
文章编号:1001 - 9146(2011)03 - 0054 - 04
t = f1 - f2;
f1 = f2; f2 = 百度文库;
}
}
else { / / 在有序表未查找区间的后段查找
if ( f1 = = 1) mid = 0;
else {
56
杭州电子科技大学学报
2011 年
mid = mid + f2; f1 = f1 - f2; f2 = f2 - f1; } } } if ( found) return mid; return 0; } 算法 1 其中: ST 为有序表( 不失一般性,此处设为整数) ,n 是记录个数,key 是待查关键字,fib 是斐波那契 数列数组。 如图 2( a) 所示为 n 等于 12 时由算法 1 得出的斐波那契判定树。
图 2 斐波那契判定树
1. 2. 2 当查找表中元素个数 n 不等于 Fj - 1 时 若查找表中元素个数 n 不等于任一斐波那契数列值减 1 时,在算法 1 中,首先查找的 mid 是 n - fib
[j - 2]+ 1; 即相当于在最前端补足 Fj - n - 1 个虚结点,使得加上虚结点后的元素个数仍为 Fj - 1。 如图 2( b) 所示是 n 等于 9 时的斐波那契判定树。此时,Fj = 13,mid = n - fib[j - 2]+ 1; 即首先查
0引言
查找是计算机数据处理时使用最频繁的基本操作,其中,经典的二分查找是针对有序表的查找方 法[1,3,4],其算法总是用待查找关 键 字 比 较 有 序 表 剩 余 部 分 的 中 间 关 键 字 来 决 定 查 找 过 程 的 下 一 步 操 作。显然,二分查找是用折半的方式分割查找范围、从而提高查找效率的方法,其算法思想是一种典型 的分治策略。斐波那契查找算法是另外一种分治的方法,它是利用斐波那契数列对有序表进行有效分 割从而实现查找的过程。斐波那契查找算法在国内、外《数据结构》的主流教材[2-4]中均有介绍,在此基 础上,Subasi. M 和 Yildirim. N 提出了一种对斐波那契查找算法进行优化的方法[5]; 本文通过多年来对 二分查找和斐波那契查找算法的研究,发现对于传统的斐波那契查找算法也可从另一角度加以改进。
1 斐波那契查找算法
1. 1 斐波那契数列
在算术书中,意大利数学家 L. 斐波那契提到了一个古代数学趣题———兔子问题: 假定一对大兔每
月能生出一对小兔,而小兔经过一个月就长成大兔,问从一对小兔开始,一年后共繁殖成多少对大兔?
这个问题导出一个数列: 0,1,1,2,3,5,8,13,21,34,…,该数列定义为斐波那契数列,它的规律是,从第
契查找的平均性能优于二分查找。实验数据表明,斐波那契查找算法大约较二分查找算法快 17% 。
参考文献
[1] 严蔚敏,吴伟民. 数据结构[M]. 北京: 清华大学出版社,1997: 218 - 238. [2] 严蔚敏,吴伟民. 数据结构题集[M]. 北京: 清华大学出版社,1999: 55. [3] 齐得昱. 数据结构与算法[M]. 北京: 清华大学出版社,2003: 275 - 279. [4] Horrowitz E,Sahni S. Fundamentals of Data Structures [M]. California: Pitmen Publishing Limited,1976: 335 - 341. [5] Subasi M,Yildirim N,Yildiz B. An improvement on Fibonacci search method in optimization theory [J]. Applied Math-
三项起,每一项都等于前两项之和,即: F j = F j - 1 + F j - 2 。它的通项公式是:
( ( ) ( ) ) an
=1 槡5
n
n
1 + 槡5 - 1 - 槡5
2
2
n = 1,2,3…
( 1)
式中,虽含有对无理数的运算,但对任一个正整数 n,结果都是整数。
以下是求斐波那契序列的 c 语言函数:
找的 mid 是 5,( 对应编号中的 Fj - 1 等于 8) 。相当于在最前端补足了 3 个虚结点,就对应编号而言还原 成查找表中元素个数等于 Fj -1时的情形。
2 斐波那契查找算法的修正
但算法 1 在查找表中元素个数不等于 Fj - 1 时有误! 当下标 mid ≤ 0 时,结点为虚结点。但 mid ≤ 0 不是结束的充分条件。以图 2( b) 为例,当查找的 key 为 a1 时,在算法 1 中 mid 的初值为 5,因 key < a5 ,mid 值修正为 2,因 key < a2 ,mid 值再被修正为 0,由于 0 号单元是虚结点,算法以失败的结果结束 了查找。
第3 期
王立波: 斐波那契查找算法的改进
57
else { mid = mid - f2; t = f1 - f2; f1 = f2; f2 = t; while( mid < 1 && f1 > 1) { / / 在右子树中查找到一个实结点或查找至最右 mid = mid + f2; f1 = f1 - f2; f2 = f2 - f1; }
ematics and Computation,2004,147( 3) : 893 - 901.
The Improvements of Fibonacci Search Algorithm
WANG Li-bo
( Institute of Software and Intelligent Technology,Hangzhou Zhejiang 310018,China) Abstract: In this paper,we propose a method,which uses Fibonacci sequences,to realize the process of di-
void FibonacciSeq ( int n,int * fib)
{ / /求 n 项斐波那契数列
fib[0]= 0;
fib[1]= 1;
for ( int i = 2; i < n; i + + )
收稿日期:2010 - 06 - 28 作者简介:王立波( 1962 - ) ,男,浙江宁波人,副教授,计算机软件.
第3 期
王立波: 斐波那契查找算法的改进
55
fib[i]= fib[i - 1] + fib[i - 2]; }
1. 2 斐波那契查找
如何利用斐波那契数列对有序表进行有效分割? 以下分两种情形讨论。
1. 2. 1 当查找表中元素个数 n 等于 Fj - 1 时
当查找表中元素个数恰好为某一斐波那契数列值减 1 时, 对于关键字 Key 的查找,斐波那契查找算法的分治策略如图 1 所示,即:
} … 算法 2 在另一些教材[3]中,若查找表中元素个数 n 不等于任一斐波那契数列值减 1 时,采用在最后端补足 Fj - n - 1 个虚结点,使得加上虚结点后的元素个数仍为 Fj - 1。此时的操作虽然避免了算法 1 的错误, 但可能导致内存泄漏,结果更不足取。
3 结束语
可以证明,含有 n 个结点的斐波那契判定树其最大深度 hn = log"( 槡5( n + 1) ) - 2 。 [1,4]
其中: " = ( 1 + 槡5) /2。此时,斐波那契查找判定树的高度大于二分查找判定树的高度,由于与斐波
那契数列紧密相关的一个重要极限 lim Fn F n - > ∞ n + 1
=
槡5 - 2
1≈0.
618(
斐波那契判定树左右子树元素个数比)
恰
好是黄金分割比,且斐波那契查找算法在分割时中只须做加、减法运算而无须做乘法运算,因此,斐波那
int j,mid,f1,f2,t ; bool found; j = 2; while ( fib[j] < = n ) j + + ; / / 取一大于 n 且距 n 最近的斐波那契值 fib[j] mid = n - fib[j - 2]+ 1; f1 = fib[j - 2]; f2 = fib[j - 3]; found = false;
第 31 卷第 3 期 2011 年 06 月
杭州电子科技大学学报
Journal of Hangzhou Dianzi University
Vol. 31,No. 3 Jun. 2011
斐波那契查找算法的改进
王立波
( 杭州电子科技大学 软件与智能技术研究所,浙江 杭州 310018)
摘要:该文讨论了分治查找的斐波那契算法,描述了利用斐波那契数列对有序表进行分割、查找的
while ( mid > 0 && ! found ) {
if ( key = = ST[mid])
found = true;
/ / 找到待查元素
else if ( key < ST[mid ]) { / / 在有序表未查找区间的前段查找
if ( ! f2 ) mid = 0;
else {
mid = mid - f2;
显然,key 存在于查找表中,算法不应以失败的查找而结束。究其失败的原因是算法 1 在遇到虚结 点时不再继续查找下去,但却忽略了此时右子树中仍有可能存在实结点。
经修改后在有序表未查找区间前段查找的过程如下: … else if ( k < ST[mid]) { / / 在有序表未查找区间的前段查找 if ( ! f2 ) mid = 0;
viding and searching in an order table after discussing the Fibonacci algorithm. Several mistakes of Fibonacci algorithm description in existing teaching material have been found. The improved Fibonacci algorithm has been provided in the paper. Also,the validity and robustness of the improved algorithm by theory and experiment has been verified. Key words: binary search; Fibonacci sequence; Fibonacci search
过程,发现了现有教材中在描述斐波那契查找算法时的错误和不足,提出了自己的算法改进方法
并给出了修正后的斐波那契查找算法,验证了改进斐波那契查找算法的正确性和鲁棒性。
关键词:二分查找; 斐波那契数列; 斐波那契查找
中图分类号:TN401
文献标识码:A
文章编号:1001 - 9146(2011)03 - 0054 - 04
t = f1 - f2;
f1 = f2; f2 = 百度文库;
}
}
else { / / 在有序表未查找区间的后段查找
if ( f1 = = 1) mid = 0;
else {
56
杭州电子科技大学学报
2011 年
mid = mid + f2; f1 = f1 - f2; f2 = f2 - f1; } } } if ( found) return mid; return 0; } 算法 1 其中: ST 为有序表( 不失一般性,此处设为整数) ,n 是记录个数,key 是待查关键字,fib 是斐波那契 数列数组。 如图 2( a) 所示为 n 等于 12 时由算法 1 得出的斐波那契判定树。
图 2 斐波那契判定树
1. 2. 2 当查找表中元素个数 n 不等于 Fj - 1 时 若查找表中元素个数 n 不等于任一斐波那契数列值减 1 时,在算法 1 中,首先查找的 mid 是 n - fib
[j - 2]+ 1; 即相当于在最前端补足 Fj - n - 1 个虚结点,使得加上虚结点后的元素个数仍为 Fj - 1。 如图 2( b) 所示是 n 等于 9 时的斐波那契判定树。此时,Fj = 13,mid = n - fib[j - 2]+ 1; 即首先查
0引言
查找是计算机数据处理时使用最频繁的基本操作,其中,经典的二分查找是针对有序表的查找方 法[1,3,4],其算法总是用待查找关 键 字 比 较 有 序 表 剩 余 部 分 的 中 间 关 键 字 来 决 定 查 找 过 程 的 下 一 步 操 作。显然,二分查找是用折半的方式分割查找范围、从而提高查找效率的方法,其算法思想是一种典型 的分治策略。斐波那契查找算法是另外一种分治的方法,它是利用斐波那契数列对有序表进行有效分 割从而实现查找的过程。斐波那契查找算法在国内、外《数据结构》的主流教材[2-4]中均有介绍,在此基 础上,Subasi. M 和 Yildirim. N 提出了一种对斐波那契查找算法进行优化的方法[5]; 本文通过多年来对 二分查找和斐波那契查找算法的研究,发现对于传统的斐波那契查找算法也可从另一角度加以改进。
1 斐波那契查找算法
1. 1 斐波那契数列
在算术书中,意大利数学家 L. 斐波那契提到了一个古代数学趣题———兔子问题: 假定一对大兔每
月能生出一对小兔,而小兔经过一个月就长成大兔,问从一对小兔开始,一年后共繁殖成多少对大兔?
这个问题导出一个数列: 0,1,1,2,3,5,8,13,21,34,…,该数列定义为斐波那契数列,它的规律是,从第