查找

既然是查找 时间复杂度肯定不可能大于N吧


什么是ASL?平均查找长度。
ASL =∑PiCi (Pi 为查找第i个记录的概率,Ci为找到第i个记录数据需要比较的次数,Ci随查找过程的不同而不同。)


二分查找:
必须是顺序表,并且有序。
向下取整
无序不能使用二分法。
二分查找,可以用二叉判定树,查找不成功的次数不超过判定树的深度,而树的深度为|log2n|+1

使用二分查找算法在一个有序序列中查找一个元素的时间复杂度为:O(logN)
二分查找最坏的情况是退化为线性查找,时间复杂度为O(n)

满二叉树时,若每个记录的查找概率相等时,Pi =1/n;ASL = 1/n(1*20+2*21+…..+n*2n-1)=log2(n+1)-1
要求查找成功的ASL最大,就是只有左子树或者只有右子树的情况@羽毛,即顺序表以第一个数或最后一个数为根节点作二叉排序树。同样,若每个记录的查找概率相等时,Pi =1/n。∑PiCi =1/n∑(n-i+1)=(n+1)/2

在有序列表中通过二分查找的复杂度一定是O(nlog2n)

right = middle - 1; left = middle + 1时才是真正的二分搜索法。注意代码可能出现的死循环

二分查找的时间复杂度( )
答案:O(log(N))

因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况:
一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4
。。。
m次二分剩下:n/(2^m)
在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为
n/(2^m)=1;
2^m=n;
所以时间复杂度为:log2(n)


动态查找和静态查找:
静态查找表只进行以下2个操作:
1.查找某个“特定”数据元素是否在查找表中
2.查找某个“特定”数据元素的各种属性
有序表、分块有序表、线性链表都是静态查找表
性能分析:平均查找长度:(当查找关键字等概率时)ASL = 1/(n+1)

动态查找表:表结构是在查找过程中动态生成的,通俗解释,对于给定key,若表中存在某关键字与key相等则查找成功返回,若未找到则插入关键字等于key的记录。
二叉排序树、平衡二叉树、B树、B+树都是动态查找。(对查找表进行插入和删除操作—即为动态的)


对于选择问题,找最大问题的下界是:n-1
找第二大问题的下界是:n+logn-2


分块查找:
分块查找适合动态变化
分块查找是将表分成若干块,分块的原则是数据元素的关键字在块与块之间是有序的,而块内元素的关键字是无序的。其可以适应动态变化的要求。
分快查找,是将顺序表分为若干块,块内元素顺序任意,块间有序,即前一块中的最大值小于后一块中的最小值。并且有一张索引表,每一项存放每一块的最大值和指向该块第一个元素的指针。索引表有序,块内无序。所以,块间查找用二分查找,块内用顺序查找,效率介于顺序和二分之间。

数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块

分块查找的平均查找长度不仅与索引表的长度有关,而且与块的长度有关。


查找失败的情况下,无序表查找需要更长,
举例:
有序:1 2 3 5 6 7 8 无序:3 2 1 5 6 7 8
当查找4时,有序表只要查到5就可以退出查找,而无序表则需全部遍历


就平均查找速度而言,下列几种查找速度快到慢关系是
哈希 折半 分块 顺序
就平均查找长度而言:折半查找、分块查找、顺序查找


折半查找:
折半查找只针对顺序存储结构,对链式存储结构不行。
折半查找一个有序表中不存在的元素,最多查找log2n+1次,即二叉排序树的深度。注:log2n为logn/log2,以2为底

折半查找中关键字比较序列的满足二叉排序树的要求
采用折半查找法查找长度为 n 的线性表时,每个元素的平均查找长度为O(log2n)

折半查找和顺序查找相比,大部分情况下要快。


哈希查找:
分块查找不适合动态变化


Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。


顺序查找:
顺序查找不管其是否有序,都进行逐个遍历比较,直到相等为止
所以平均情况下查找长度相同

查找成功时的平均查找长度(假定查找每个元素的概率均相等)为(n+1)/2
顺序查找法适用于存储结构为顺序或链接存储的线性表。
对于静态表的顺序查找法,若在表头设置监视哨,则正确的查找方式为
从第n个元素往开始前查找该数据元素

既希望较快的查找又便于线性表动态变化的查找方法是 :索引顺序查找


概率查找:

用概率查找改进查找效率,是经过多次查找以后使得:查找次数越多的元素查找速度越快


二叉查找树:
平衡二叉树就是左右子树的高度大致相等。
具有n个节点线性表,组织成平衡二叉树后高度为log 2 n
所以查找最坏情况是查找到叶子节点,所经历的长度就是log 2 n
这种二叉树叫二叉查找树


KMP模式匹配算法:
整个算法的时间复杂度为O(n+m).


朴素匹配算法 时间复杂度O((N-P+1)*P)
KMP匹配算法 时间复杂度为O(N+P)


判断是否有环的方法包括:
1.DFS深度优先:深度搜索,如果向下搜索的时候搜索到前面的节点在,则说明有环,如图,搜索到6,继续搜索会搜到4,而此时4已经被访问过了,说明有环。
2.拓扑排序

最短路径允许有环


折办查找习题:

具有12个关键字的有序表,折半查找的平均查找长度()
答案:3.1

判定树的层数log(n+1)向下取整数等于4,前三层为满二叉树:1-2-4,第四层5,所以平均查找长度=(1*1+2*2+4*3+5*4)/12=3.1
1—1
2—2
4—3
5—4

公司里面有1001个员工,现在要在公司里面找到最好的羽毛球选手,也就是第一名,每个人都必须参赛,问至少要比赛多少次才能够找到最好的羽毛球员工。
答案:1000

这道题其实就是一种二叉树结构,1001个员工为叶节点,而比赛次数则是求非叶节点。n2=n0-1

有个长度为12的无重复有序表,按折半查找法进行查找,在表内各元素等概率情况下,查找成功所需的平均比较(三元比较)的次数为()
答案:37/12

此题按照一颗完全二叉树来考虑,12个结点是4层,所以为(1*1+2*2+4*3+5*4)/12


对于有序的列表,排序最快的是插入排序,时间复杂度O(N)


设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找 并且索引表和块内均采用顺序查找 ,则其平均查找长度为 (     ) 。
答案:6.5

总的平均查找长度为:分块查找的平均长度+顺序查找的平均长度;前者为:(1+2+3+4+5)/5=3,后者为:(1+2+3+4+5+6)/6=3.5


查找效率最高的二叉排序树是:平衡二叉树
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值