我读了一些声称Fibonacci搜索平均比二分搜索更快的材料,主要原因是"它只涉及加法和减法,而不是2"
。我有一些问题:
1.斐波纳契的搜索速度比二进制搜索速度快,而不考虑运算速度?因为二进制搜索的步骤较少。
2.除以2可以通过位移操作来完成,它是否真的慢于加法?
3.与二元搜索相比,斐波纳契搜索的优势是什么?
答案 0 :(得分:7)
Fibonacci的搜索速度比二进制搜索快,而不考虑 操作速度?由于二元搜索步骤较少。
这取决于列表的底层存储系统。例如 - 想想一个磁盘。它更便宜'在先前读取的一个圆柱中寻找一个位置 - 因为读取臂不必移动。因此,如果您的读取彼此更接近 - 您更可能需要更少地移动读取臂 - 因此每个磁盘搜索的预期时间更短。此外,将读取臂移动到较小的圆柱体上同样比将其移动到更多圆柱体上更快
在示例中:
将读取臂从(1)移动到(2)比从(1)到(3)移动要便宜得多。因为(2)更接近' (在地址方面)然后(3),较短的跳跃更可能属于这一类别。 [从(1)到(2),阅读臂根本不会移动,它只会让盘旋转直到达到它为止]
除以2可以通过位移操作完成,是不是真的 比加法慢?
这主要是硬件(和编译器优化)问题。我无法想象制造商为什么不能进行这种优化的任何原因,而且我所知道的大多数实现中的位移与添加一样快。
与二元搜索相比,斐波纳契搜索的优势是什么?
如(1)中所述 - 连续磁盘搜索之间的距离越短,导致搜索时间越短(预期)。
答案 1 :(得分:3)
2加法,减法和除法都需要一个时钟。所以所涉及的算法并不支持Fibonacci,相反。
使用Fibonacci(Log(2)/Log(Phi) - 1
)需要大约44%的查找次数。很难通过更快的内存访问来补偿!
如果您正在寻找二元搜索的替代方案,请尝试插值搜索。 http://en.wikipedia.org/wiki/Interpolation_search