关于二叉树本质的回答

转自知乎里面一个人的回答:


作者:匿名用户
链接:http://www.zhihu.com/question/37381035/answer/84584381
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

很明显,题主没有学的比较好。
或者没参加过acm的相关训练。只是一个平时跟着学做些课后题然后混毕业的。

二叉树,本质上,是对链表和数组的一个折中。。
比如,我有一个任务,需要输入
10万个数据(32位整数),然后有两个操作:
1.添加(删除)一个整数。
2.询问第x大的数据。

比如,我给你 1, 8, 13, 10(等等一堆数据).......
然后我询问第3大的数据,
然后我插入 18
然后我询问第4大的数据
我再插入 9
我再询问第2大的数据

不停的重复1,2
重复10万次。。

应该如何实现。
你会发现,用有序链表,不行,查找(包括1需要找到对应位置,以及2查找)成本大O(N),但具体这个插入操作成本小O(1)。
用有序数组,查找(2的查找)成本小O(1)。但1的插入操作成本很大O(N)。

所以,我们折中使用排序二叉树(二叉树仅仅作为排序二叉树的基础),查找(包括1需要找到对应位置,以及2查找)成本挺小O(logN)。具体这个插入操作成本也挺小O(logN)。

具体的应用就是由排序二叉树(由于普通排序二叉树可能会有不平衡的情况)引申出来的红黑树(linux中ext3文件系统管理),avl树“windows对进程地址空间的管理”。

回答不出来也不怪你。毕竟这些知识绝对是超纲了。
这是一个口子小但可以扯的很多的题目,你能大概讲个二叉树的遍历也就算可以了。只是和某些acm的选手来说,你会很吃亏。因为acm选手是知道并且用过红黑树之类的东西的。



应该用什么姿势学算法?
算法在具体工作中用的真的不多,就剩半年,你也不可能学到acm选手的程度。。所以建议,去实习吧,关于算法,把你们以前的那本算法教材给捡起来复习复习,每一个具体的算法例子都给用代码敲一遍,跑一跑,大学也就基本结束了。。。。。不要太多留恋了,半年很快的。 实习工作找不到?总能找到的,只是可能待遇不好。转正的工资不怎么样而已。


算法学的好又能怎么样。
比如我,吃着火锅,装着b,结果还不是混的很惨。匿名了。

最后谢邀。



============================4月2日修改==============================
感谢诸位大神捧场。
点赞挺多了,我就对 “二叉树,本质上,是对链表和数组的一个折中” 补充几个脑洞:
建立在如下推论上:假定把数组看成N叉树,那么链表就是1叉树,由于数组只有1层,二叉树有logN层,而链表有N层,"logN对1" 以及 "N对logN" 都是 无限大的关系。。。相当于我们在1 ~ N之间找了一个logN作为两者的折中。。。。。。
进一步的脑洞是,如果我们是a叉树,那么结果就是 log(a)N = \frac{log(2)N}{log(2)a}层,但
考虑分母部分。
  • a = 1时,log(2)1 = 0
  • a = 2时,log(2)2 = 1
  • a = N时,log(2)N = N
恰好构成了 0, 1, N的三个经典数字。。。。
查找和插入一共所需的次数可以简化为:每层数量+总层数 = a + \frac{log(2)N}{log(2)a} 当a是大于等于1的整数时,a取2是最划算的。。。所以综合以上推断,个人得出," 二叉树,本质上,是对链表和数组的一个折中"。 这对于查找和插入是类似1:1(同一数量级)的需求,用二叉树(排序二叉树等)是很划算的。如果不是同一数量级可以考虑,增大a或者减少a,具体问题具体分析,这是个工程问题。得考虑编码难度,算法常数,可维护性等多方面需求。不再一一分析。

以上仅仅是个人奉献的脑洞,没有任何成熟的理论支撑。感谢看到这里。

你可能感兴趣的:(算法)