美文网首页
折半查找和斐波那契查找的对比测试笔记

折半查找和斐波那契查找的对比测试笔记

作者: c02d1b205155 | 来源:发表于2017-02-28 15:58 被阅读130次

先上两者的 Python 代码。
折半查找:

def bin_search_(find_num, list_, k):
    split_pos = len(list_) // 2
    if find_num == list_[split_pos]:
        return split_pos + k
    elif len(list_) == 0:
        return None
    elif find_num < list_[split_pos]:
        return bin_search_(find_num, list_[:split_pos], k)
    else:
        return bin_search_(find_num, list_[split_pos+1:], k+split_pos+1)


def bin_search(find_num, list_):
    return bin_search_(find_num, list_, 0)


if __name__ == '__main__':
    list_ = [1, 2, 4, 5, 9, 11, 20, 33, 44, 50]
    find_num = 20
    print(bin_search(find_num, list_))

斐波那契查找:

def get_fib(list_len):
    a, b = 0, 1
    fib = []
    while True:
        fib.append(a)
        if a > list_len:
            return fib
        else:
            a, b = b, a + b


def fib_find(find_num, index, list_, fib, k):
    split_pos = fib[index-1] - 1
    if find_num == list_[split_pos]:
        return split_pos + k
    elif len(list_) == 0:
        return None
    elif find_num < list_[split_pos]:
        return fib_find(find_num, index-1, list_[:split_pos+1], fib, k)
    else:
        return fib_find(find_num, index-2, list_[split_pos+1:], fib, k+fib[index-1])


def fib_search_(find_num, list_, fib):
    list_len = len(list_)
    index, good_len = len(fib)-1, fib[-1]
    [list_.append(list_[-1]) for i in range(good_len-list_len)]
    final_index = fib_find(find_num, index, list_, fib, 0)
    [list_.pop() for i in range(good_len-list_len)]
    if final_index > list_len - 1:
        return list_len - 1
    else:
        return final_index


def fib_search(find_num, list_):
    fib = get_fib(len(list_))
    return fib_search_(find_num, list_, fib)


if __name__ == '__main__':
    list_ = [1, 2, 4, 5, 9, 11, 20, 33, 44, 50]
    find_num = 20
    print(fib_search(find_num, list_))
    find_num = 50
    print(fib_search(find_num, list_))

根据资料显示,斐波那契查找的平均效率会比折半查找更高。但在 Python 中,根据测试发现,使用斐波那契查找时,列表的 append 和 pop 操作比较消耗时间;除此之外,递归次数也比折半查找要多。
总之,在大多数时候,有序线性表查找时直接使用折半查找足以使用。

相关文章

  • 折半查找和斐波那契查找的对比测试笔记

    先上两者的 Python 代码。折半查找: 斐波那契查找: 根据资料显示,斐波那契查找的平均效率会比折半查找更高。...

  • Java数据结构与算法:查找算法

    在java中,我们常用的查找有四种: 顺序(线性)查找 二分查找/折半查找 插值查找 斐波那契查找 1、线性查找 ...

  • 数据结构_查找_折半/插入/斐波那契

    数据结构_查找_折半/插入/斐波那契 这三种查找算法都是在数据列有序的前提下进行的 折半查找 对于n个元素的数据列...

  • 斐波那契查找

    斐波那契查找的前提是待查找的查找表必须顺序存储且有序。 相对于折半查找,一般将待比较的key值与第mid=(low...

  • 二叉排序树(十二)

    1. 前言 前面的查找我们都是静态查找,因为数据集是有序存放,查找的方法有多种,可以使用折半,插值,斐波那契等,但...

  • 斐波那契查找算法

    算法原理: 斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。 构建一个斐波那契数列 扩展被查询数列:...

  • js

    二分查找(折半查找) 水仙花数 判断是否为完全二叉树 找出只出现一次的数字 斐波那契数列

  • 有序表查找 - 斐波那契查找

    了解斐波那契查找之前先来了解下斐波那契额数列。 斐波那契数列,又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁...

  • JavaScript数据结构22—简单的查找算法

    以下算法包括了 顺序查找 插值查找 二分查找 斐波那契查找 输出 { index: 5, count: 10 }{...

  • day13

    查找算法 顺序查找 二分查找 差值查找 斐波那契查找 二分查找 前提数组必须是有序的。 升级 Interpolat...

网友评论

      本文标题:折半查找和斐波那契查找的对比测试笔记

      本文链接:https://www.haomeiwen.com/subject/vkmxgttx.html