查找

  • 顺序查找:从头开始查找到尾端
    python中的实现

    def order_search(array,x):
        i = 0
        while(i<len(array)):
            if array[i] == x:
                return i
            else:
                i += 1
        return -1
            
    a = [1,2,3,4,5,6,7,8]
    result = order_search(a,6)
    print(result)
    

    顺序查找分为两种

    • 无序顺序表查找

      顺序查找的性能:

      ​ 平均查找长度:(n+1)/2

      ​ 最大查找长度即查找失败时的比较次数:n+1

    • 有序顺序表查找

      在平均查找长度上,和无序顺序表的查找长度相同;在查找失败时的查找长度相比,有序顺序表的顺序查找性能高于无序顺序表;

    折半查找:

    python实现

    def half_fold_search(array,x):
        low = 0
        high = len(array) - 1
        while(low<=high):
            mid = (low+high)//2
            if x == array[mid]:
                return mid
            if x < array[mid]:
                high = mid -1
            else:
                low = mid + 1
        return -1
    a = [1,2,3,4,5,6,7,8]
    result = half_fold_search(a,5)
    print(result)
    

    折半查找的过程可以使用折半查找判定树来表示,因为每次以mid划分,左右数目之差不超过1,因此该判定树为一棵二叉平衡树。其实质上也是一颗二叉排序树,二叉排序树的中序遍历序列是一个有序序列;

    二叉排序树:其左子树上的值均小于其节点,右子树上的值均大于其节点值,并且该节点的左右子树也都为二叉排序树;

    一个查找序列有n个元素,则对应的判定树中有n个分支节点和n+1个叶子节点

    (n0 = n2 + 1)

    折半查找只使用与有序顺序表,而不适用于链式存储结构

    折半查找的平均查找长度为o(logn) ,而最大查找长度为判定树的深度log(n+1)取上界

    分块查找:是顺序查找和折半查找的结合,其基本思想是将序列分成多个块状结构,每个块之间按顺序排列,但是块内元素可以随意排列

    该查找方式采用索引表和查找表结合,索引表中记录每个块中的最大值以及每个块中的第一个元素的索引,分块查找长度包括了索引表和查找表的查找长度;

    最短查找长度即两个表都采用折半查找方式

    1)有序顺序表既可以采用折半查找,也可以采用顺序查找,但两者的查找速度不能确定,

    因为一般情况下折半查找是优于顺序查找的,但是当目标数据在查找表的前端时,顺序查找的效率会高于折半查找;

    2)有序顺序表中采用折半查找其查找失败的最大长度为判定树的深度log(n+1)1取上界

    3)折半查找和二叉排序树两者的性能比较:两者的平均查找长度相同,但在最坏情况下二叉排序树为单支树是为o(n)

    4)使用折半查找一个不存在的元素时,比较的次数最大为判定树的深度h,至少要比较h-1次

    5)折半查找判定树是平衡二叉树、二叉排序树

散列表:一种根据关键字直接进行访问的数据结构

散列函数:是指把查找表中的关键字映射成该关键字对应的地址的函数

冲突:散列函数将两个不同关键字映射到了相同的地址上,而这些发生碰撞的关键字成为同义词

散列函数的构造:

​ 原则:

​ 1)散列函数的定义域需要包括所有的关键字,而值域大小依赖于散列表的大小

​ 2)散列函数计算出的地址应能等概率、均匀分布在整个地址空间,减少冲突

​ 3)散列函数应在满足上述条件下尽量的简单(奥卡姆剃刀)

​ 方法:

​ 1)直接定址法(使用关键字的线性函数值作为散列地址,但是不连续的关键字会造成空间浪费)

​ 2)除留取余法(取一个最接近但不大于散列表长m的质数p,addr = key%p)

​ 3)平方取中法、数字分析法、折叠法等

冲突的解决办法:

  • 开放定址法,通俗理解就是在加上一个增量序列

    • 增量序列的选择

      ​ 1)线性探测法

      ​ 2)平方探测法

      ​ 3)再散列法

      ​ 4)伪随机序列法

  • 拉链法

    将同义词(即发生冲突的关键字)存入一个线性链表,而散列表中存放该同义词线性链表的头指针,该方式适用于经常插入和删除的情况

散列表查找效率三因素:散列函数,冲突处理函数,装填因子(散列表的装满程度)

散列表的平均查找长度直接依赖于装填因子,装的越满,发生冲突的可能性就越大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值