milo
我是应届生,这是我在校招路上发现的一个对我帮助很大的专栏,以前上课无论是老师的教学还是书本,均无法收获到知识,通过争哥这个专栏,我真的又拾起了信心,真的感谢争哥,我会持续关注你的动态的。(目前专栏学习到一半,看到告别篇,感触很多,祝越来越好)
2019-02-23
4
Zhangxuesong
我也是一名“潜水党”, 从第一篇开始学习老师的文章就被这种通俗易懂的讲法所吸引, 基础的部分学完后, 感觉自己对程序又有了更深一层的理解, 也复习了曾经学过的东西, 感觉每隔一段时间都可以回来复习一下, 让自己工作中碰到的问题和所讲的原理碰撞一下, 将实际应用跟理论更好的结合起来, 灵活使用, 将实际开发中碰到的问题抽象成某种数据结构和算法是非常关键的技能. 希望在新的一年里, 各位前行中的小伙伴,可以坚持前行, 迷茫时回来看看老师文章, 加油^_^
2019-02-20
5
敏さん
1.不浪费时间,同样的代码在不同配置的电脑和环境,运行的速度会不一样.
2.比如代码写的很烂,运行很慢,基本不会有公司特地来升级硬件提升速度的,都是优先优化算法.
3.进行复杂度分析可以抛开上述硬件环境等差异,能够直观的看出一个算法的性能.
4.还有就是性能测试后要是速率太慢,还是得要分析原因,试图优化,最终还是逃不掉复杂度分析.
以前都没往这些方面想过,楼主讲的内容非常干货,棒棒的!
2022-03-13
4
一个工匠
当年进阿里,老师的算法有50%的加成。当年反复阅读最多的两个资源,一个是当前专栏,一个是《程序员的自我修养》,均 10+ 次数。
现在想进军微软,就再来重刷了,老师的算法是此次进军80%的加成。
打算重刷完毕后,报一下老师的培训班。老师是铁血真大神。
2022-03-13
28
Sam
牛B的人写牛B的代码,我非常喜欢这篇,尤其是计数排序的技巧,对于范围不大的排序需求,这个技巧是非常好用,也很喜欢争哥写的计数排序的代码,我抄了几遍,越来越喜欢,感觉能够写这样的代码,而感到无比荣幸!~
2021-08-08
4
牧凉
好强,讲的真不错
2021-07-26
4
焱
为什么学习数据结构和算法?我认为可以为我们的代码优化提供思路,比如选择恰当的结构组织数据,减少时间复杂度。
2021-04-30
5
爱学习的小迪
总结:
1. 特点
任意节点的左子树都比当前节点的值小,右子树都比当前节点的值大。
2. 三种具体的操作
它支持快速的查找,添加和删除操作。其中添加和查找操作都比较简单,只需要按照二叉查找树的特点进行搜索就可以了,比较麻烦的是删除操作,它会涉及到以下三种情况:
(1)要删除的节点是叶子节点。直接让其父节点指向该叶子节点的指针置为空即可
(2)要删除的节点存在一个子节点,不论子节点是作为左节点还是右节点。可以找到要删除的节点的父节点,然后将其指向被删除节点的指针指向被删除节点的子节点。
(3)要删除的节点存在两个节点。当出现这种情况时,我们需要先找到有右子树中最小的节点(这个节点一定是个左节点),并将该节点的值赋值给要删除节点的值(相当于给这个最小节点挪了位置);然后再进行删除这个最小节点,
此时最小节点可能出现的情况只有(1)或者是(2)。然后再按照(1)或者是(2)的步骤进行删除即可。此外,还有一种比较浪费内存的做法,让删除变得没有这么麻烦,那就是采用伪删除的做法,直接将要删除的节点标记删除。
3. 特殊的操作
除了查找,插入,删除操作外,它还支持快速的查找最大节点,最小节点等操作。而且中序遍历二叉查找树,可以有序的输出树中的元素
4. 当存在重复元素的情况时
上述讨论的都是二叉查找树中不存在重复元素的情况。当树中存在重复元素时,我们可以采用两种策略:
(1)第一种策略:一个节点存储多个相同的元素,使用可扩容的数组存储
(2)第二种策略:相同的节点进行二次插入的时候,作为比其大的节点进行处理,这种这个相同的元素一定会出现再其右子树中。此时进行查找操作,当查找到相同元素后不应停止,而应该再去其右子树继续寻找,从而找到所有的元素;删除操作同理。
5. 复杂度分析
二叉查找树的查找过程,是按层进行查找的。所以时间复杂度跟树的层数有关系。可以表示为O(layer)
最坏情况下,当元素按照升序或降序的顺序进行插入时,就会导致二叉查找树出现一边倒的情况,此时树的层数就等于树中元素的个数,时间复杂度为O(N)
最好情况下,二叉查找树是一棵完全二叉树,完全二叉树的层数k 可以表示为:n>= 1 + 2 + 4 +...+ 2^(k-2); n<= 1+ 2 + 4 +...+ 2^(k-2) + 2^(k -1) 。从而可以推导出 k <= logN 。所以时间复杂度为O(logN)
当对二叉查找树进行频繁的添加和删除时,可能会造成失衡,从而导致复杂度下降,最坏情况下降低至O(N)。
6.扩展:有了散列表的存在,为什么还需要二叉查找树?
(1)散列表无法有序输出元素,如果要想达到有序的输出元素,需要先进行排序。而二叉查找树直接中序遍历就可以得到
(2)散列表的实现过程需要考虑的因素比较多,比如散列函数的选择,散列冲突的解决办法等,而用二叉查找树就没有这些问题
(3)散列表虽然插入,删除,查找的时间复杂度是常量级别的,但是在出现散列冲突时,加上散列函数计算哈希值所耗费的时间而言,可能也没有logN快
(4)散列表虽然是常量时间复杂度,但是当出现散列冲突时,性能是不稳定的,而平衡二叉查找树确是非常稳定的
(5)散列表的填充因子不能太大,比较耗费内存,尤其是采用开发寻址法解决散列冲突时
总之每种数据结构都有其特点,具体情况具体分析,每一种数据结构都有适用其特点的场景,我们只需要在正确的场景下正确的使用合适的数据结构就好了。正所谓:存在即合理。
2021-01-21
1
年年有余
棒,自己也要加油努力。
2021-01-21
4
石小
八皇后中先判断符不符合条件,再记录保证记录的都是有效的。01背包就是一颗二叉搜索数,先序遍历,书中的每个叶节点对应一种情况,没有额外存储,数据在递归调用的栈上。
2021-01-20
编辑推荐
讲师的其他课程
包含这门课的学习路径
计算机基础知识
12门课程 96.5w人学习
看过的人还看了