典型的查找算法



查找:

只进行查找的称为静态查找表;

在查找的过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的元素,称为动态查找表。

静态查找:

1.顺序查找:

算法思想:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功

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

2、二分查找(有序表):

算法思想:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。

平均查找长度:(n+1)/n *log2(n+1) -1

3、分块查找(索引顺序查找):

算法思想:首先将一个线性表(即主表)按照一定的函数关系和条件划分为若干个逻辑字表,为每个字表建立一个索引项,由所有的字表的索引项构成一个索引表。当进行分块查找时,先根据所给的关键字查找索引表,从中找出给定k值小于或等于索引值的那个索引块,找到待查块,然后在主表中查找该快,查找待查的记录。

平均查找长度:索引表是有序的,所以在索引表中可以用顺序查找,也可以用折半查找;而块内的记录的随机排序的,所以在块中用顺序查找。

顺序查找确定块:平均查找长度为1/2 *(n/s +s)+1

二分查找确定块:平均查找长度为log2(n/s +1)+s/2


动态查找:(表结构动态生成)

1、二叉排序树查找

二叉排序树(二叉搜索树、二叉查找树):二叉排序树中序遍历得到的必定是一个有序序列。

查找过程:

(1)若查找树为空,查找失败;

(2)若查找树非空,将给定值和查找树的根节点比较:

     若相等,查找成功,结束查找过程;

     若给定值小于根节点,查找将在根节点的左子树上继续进行,转至(1)

     若给定值大于根节点,查找将在根节点的右字树上继续进行,转至(1)

时间复杂度:平均O(logn),最坏O(n)

二叉排序树的插入:

新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。

二叉排序树的结点删除:

假设在二叉排序树上被删结点为p,其双亲结点为f,且p为f的左孩子,下面分三种情况讨论:

(1)若p结点为叶子节点,即pl和pr均为空树,由于删去叶子节点不破坏整棵树的结构,则只需修改其双亲结点的指针即可。

(2)若p结点只有左子树pl或者只有右子树pr,此时只要令pl和pr直接成为其双亲结点f的左子树即可。

(3)若p结点的左子树和右子树均不空。

2、二叉平衡树

左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1.若将二叉树上结点的平衡因子定义为该节点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只能是-1,1,0.平衡树查找的时间复杂度为O(logn)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值