数据结构之查找

1、查找

概念:是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素。

基于线性表的查找(静态查找表):例如:顺序查找、折半查找、分块查找等。

基于树的查找(动态查找表):例如:二叉排序树、B树、AVL树等。

2、基于线性表的查找

       线性索引查找是在待查询序列比较大,或者不方便排序的情况下的一种措施,通过一个较小的索引来实现快速查找。比如汉语字典,我们需要先在前面的索引中找到这个字,然后再到后面去查找这个字的详细资料,那么前面的这个索引起到的作用就是这个作用了。线性索引查找在实际应用中有多种形式,适合不同的情况。

(1) 顺序查找

        概念:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。

        平均的查找长度为(n+1)/2,最好的长度为1,最差的查找长度为n。时间复杂度o(n)

缺点也比较明显:算法效率较低,在较大规模的数据集合中进行查找时,不宜采用顺序查找

优点在于:算法简单易行,且对表的结构无任何要求。

(2)折半查找(二分查找)

概念:线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储,其时间复杂度为O(logn)。

在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

步骤:(1)确定查找区间的中点位置:mid=[(low+high)/2],其中,low为起始位置,                                                                                        high为终止位置

                              (2)将位于mid位置处的数据元素的关键字与给定值key进行比较

                                            1.   key=elem[mid].key    成功

                                            2.   key<elem[mid].key    则high=mid -1

                                            3.   key>elem[mid].key    则low=mid-1

                              (3)重复,直到2查找成功或者low>high

(3)索引查询(分块查找)

      概念:首先查找索引表,可用二分查找或顺序查找,然后在确定的块中进行顺序查找。

      当数据量更大的时候,如果稠密索引的大小也超出了内存的容量,那么查找索引也会带来IO,效率就会大大降低了。分块索引的不同在于不需要对每一个记录记录索引,而是对记录进行分块。分块索引要求数据是分块有序的,也就是说,数据被分为很多块,每一块内部并没有排序,但是第n块中的每一个元素都比第n+1块要小,这样虽然每一块是无序的,但块和块是有序的。维护这样的顺序关系要比对整个排序消耗得少很多。
    分块索引只需要记录每一块的信息,查找时先定位到某一块,然后到那个块里顺序查找。分块索引内记录的索引项包括这个块的最大值(或最小值)、位置信息等,可以包括块内元素个数等信息。


3、基于树的查找

       前面讨论的几种查找方法中,二分查找效率最高,但其要求表中记录按照关键字有序,且只能在顺序表上实现,从而需要在插入和删除操作时移动很多的元素。如果不希望表中记录按关键字有序,而又希望得到较高的插入和删除效率,可以考虑使用几种特殊的二叉树或树作为表的组织形式。

(1)二叉排序树

  概念:

(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;

(2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

B树、红黑树,仙子啊不想写了。

 

 

参考:https://www.cnblogs.com/edisonchou/p/4700850.html

https://blog.csdn.net/jarelzhou/article/details/18564943

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值