查找算法学习(2)

1 将线性表中的结点信息组织成平衡二叉树,其优点之一是总能保证任意检索长度均为log2 n量级(n为线性表中的结点数目)  正确

分析:平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

平衡二叉树的常用实现方法有 红黑树 、 AVL 、 替罪羊树 、 Treap 、 伸展树 等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的 数列 ,可以参考Fibonacci(斐波那契)数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 


分析二: 平衡二叉树:一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,查找时间的时间复杂度为O(log2n)。 

二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。  



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


2.任一查找树(二叉分类树)的平均查找时间都小于用顺序查找法查找同样结点的线性表的平均查找时间。(错误)

分析:只有左子树或者右子树的BST都是一样。


3.二分查找的时间复杂性为

分析:二分查找因为每次都是从中间点开始查找,所以最坏情况是目标元素存在于最边缘的情况。 比如1~9,最坏情况就是1或者9,当然4,6这种也算是边缘(中心的边缘)。 因为二分查找每次排除掉一半的不适合值,所以对于n个元素的情况: 

一次二分剩下:n/2 ; 

两次二分剩下:n/2/2 = n/4 ;

m次二分剩下:n/(2^m) ;

在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为 n/(2^m)=1; 2^m=n; 

所以时间复杂度为:log(n) .


分析二: 最坏时间复杂度:O(logN) 平均时间复杂度:O(logN) 最坏空间复杂度:O(1) 



4.从n个数里面找最大的两个数理论最少需要比较: n+logn-2

分析:

 类似比赛晋级,两两配对比较,赢的再两两配对,最后得到冠军(最大的数),可以看成是一棵二叉树,以4人为例: 

                            0

                      0          2

                   0    1    2     3

可以看出,找出最大的数比较次数是n-1。然后第二大的数肯定是跟冠军比较过的数字,那么很明显每一层都有一个,所以有logn-1次比较。 
所以总共是n+logn-2次比较  。


如果n是奇数的话,一样的道理,例如4个数1234和5个数12345,假设都是小的赢,无非是最后两个数34的比较变成最后三个数345的比较,这样在得出冠军的时候会多一次比较(345比较两次而34比较1次),但是得出亚军的时候,比较4个数的话,需要比较2和3,比较5个数的话,是还是比较2和3,logn-1不变,所以最后结果也只是多了1。

分析二:

1.建小堆是时间复杂度为O(n)或比较n-1次,找到最大的一个; 
2.找到最大元素后,调整小堆,找到次大元素,比较logn-1;

3.所以共需要比较 n+logn-2次

(这里仅考虑问题的一般公式,不是通用公式,即没有考虑n=1,n=2的情况)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值