极客时间算法训练营2021版-算法与数据结构介绍
数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。 数据结构是为算法服务的,算法是要作用再特定的数据结构上的。
链接: https://pan.baidu.com/s/1d6YONkCi4u7T1ZBm1yZLYg 提取码: iamh 作者-\/ 307570512
最常用的数据结构预算法:
数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Tire树 算法: 递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wAeXURdG-1634303182903)(//cdn.miwangke.com/storage/uploads/202106/bf46f7fa7d3ddc732b56c61a5529fd25.png)]
极客时间算法训练营2021版-数据结构算法实战
1.AVLtree 定义:最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。
节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。 一般我们所看见的都是排序平衡二叉树。
AVLtree使用场景:AVL树适合用于插入删除次数比较少,但查找多的情况。插入删除导致很多的旋转,旋转是非常耗时的。AVL 在linux内核的vm area中使用。
2.二叉搜索树 二叉搜索树也是一种树,适用与一般二叉树的全部操作,但二叉搜索树能够实现数据的快速查找。
二叉搜索树满足的条件:
1.非空左子树的所有键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 3.左右子树都是二叉搜索树
二叉搜索树的应用场景:如果是没有退化称为链表的二叉树,查找效率就是lgn,效率不错,但是一旦退换称为链表了,要么使用平衡二叉树,或者之后的RB树,因为链表就是线性的查找效率。
3.红黑树的定义 红黑树是一种二叉查找树,但在每个结点上增加了一个存储位表示结点的颜色,可以是RED或者BLACK。通过对任何一条从根到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。
当二叉查找树的高度较低时,这些操作执行的比较快,但是当树的高度较高时,这些操作的性能可能不比用链表好。红黑树(red-black tree)是一种平衡的二叉查找树,它能保证在最坏情况下,基本的动态操作集合运行时间为O(lgn)。
红黑树必须要满足的五条性质:
性质一:节点是红色或者是黑色; 在树里面的节点不是红色的就是黑色的,没有其他颜色,要不怎么叫红黑树呢,是吧。
性质二:根节点是黑色; 根节点总是黑色的。它不能为红。
性质三:每个叶节点(NIL或空节点)是黑色;
性质四:每个红色节点的两个子节点都是黑色的(也就是说不存在两个连续的红色节点); 就是连续的两个节点不能是连续的红色,连续的两个节点的意思就是父节点与子节点不能是连续的红色。
性质五:从任一节点到其每个叶节点的所有路径都包含相同数目的黑色节点。从根节点到每一个NIL节点的路径中,都包含了相同数量的黑色节点。
红黑树的应用场景:红黑树是一种不是非常严格的平衡二叉树,没有AVLtree那么严格的平衡要求,所以它的平均查找,增添删除效率都还不错。广泛用在C++的STL中。如map和set都是用红黑树实现的。
4.B树定义 B树和平衡二叉树稍有不同的是B树属于多叉树又名平衡多路查找树(查找路径不只两个),不属于二叉搜索树的范畴,因为它不止两路,存在多路。
B树满足的条件:
(1)树种的每个节点最多拥有m个子节点且m>=2,空树除外(注:m阶代表一个树节点最多有多少个查找路径,m阶=m路,当m=2则是2叉树,m=3则是3叉); (2)除根节点外每个节点的关键字数量大于等于ceil(m/2)-1个小于等于m-1个,非根节点关键字数必须>=2;(注:ceil()是个朝正无穷方向取整的函数 如ceil(1.1)结果为2) (3)所有叶子节点均在同一层、叶子节点除了包含了关键字和关键字记录的指针外也有指向其子节点的指针只不过其指针地址都为null对应下图最后一层节点的空格子 (4)如果一个非叶节点有N个子节点,则该节点的关键字数等于N-1; (5)所有节点关键字是按递增次序排列,并遵循左小右大原则;
B树的应用场景:构造一个多阶的B类树,然后在尽量多的在结点上存储相关的信息,保证层数尽量的少,以便后面我们可以更快的找到信息,磁盘的I/O操作也少一些,而且B类树是平衡树,每个结点到叶子结点的高度都是相同,这也保证了每个查询是稳定的。
5.B+树 B+树是B树的一个升级版,B+树是B树的变种树,有n棵子树的节点中含有n个关键字,每个关键字不保存数据,只用来索引,数据都保存在叶子节点。是为文件系统而生的。
相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别
(1)B+跟B树不同,B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加; (2)B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接; (3)B+树的根节点关键字数量和其子节点个数相等; (4)B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;
特点: 在B树的基础上每个节点存储的关键字数更多,树的层级更少所以查询数据更快,所有指关键字指针都存在叶子节点,所以每次查找的次数都相同所以查询速度更稳定;
应用场景: 用在磁盘文件组织 数据索引和数据库索引。
6.Trie树(字典树) trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
在图示中,键标注在节点中,值标注在节点之下。每一个完整的英文单词对应一个特定的整数。Trie 可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含在分支的顺序中的。 键不需要被显式地保存在节点中。图示中标注出完整的单词,只是为了演示 trie 的原理。
trie树的优点:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。缺点:Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.
其基本性质可以归纳为:
根节点不包含字符,除根节点外每一个节点都只包含一个字符。 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 每个节点的所有子节点包含的字符都不相同。 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。
算法与数据结构体系课-如何系统地学习数据结构与算法?
学习方向 1、复杂度分析 看动画轻松理解时间复杂度(一)
看动画轻松理解时间复杂度(二)
冰与火之歌:「时间」与「空间」复杂度
每个程序员都应该收藏的算法复杂度速查表
2、基本算法思想 五分钟了解一下什么是「贪心算法 」
有了四步解题法模板,再也不害怕动态规划!
(进阶版)有了四步解题法模板,再也不害怕动态规划!
(再进阶版)有了四步解题法模板,再也不害怕动态规划!
浅谈什么是分治算法
看动画轻松理解「递归」与「动态规划」
浅谈什么是动态规划以及相关的「股票」算法题
深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法 「多图警告」手撕排序算法 – iOS进阶必备
十大经典排序算法动画与解析,看我就够了!(配代码完全版)
这或许是东半球分析十大排序算法最好的一篇文章
4、搜索 几道和「广度优先搜索」有关的算法面试题
初识广度优先搜索与解题套路
从简单二叉树问题重新来看深度优先搜索
5、查找 二分查找算法详解
一网打尽!二分查找解题模版与题型全面解析
面试官,我会写二分查找法!对,没有 bug 的那种!
6、字符串匹配 动画:BM 算法中的坏字符规则与好后缀规则
动画:七分钟理解什么是KMP算法
动画:什么是 BF 算法 ?
动态规划之 KMP 算法详解(配代码版)
7、线性表 如何高效对有序数组/链表去重?
超详细!详解一道高频算法题:数组中的第 K 个最大元素
一道简单的数组遍历题,加上四个条件后感觉无从下手
数组特性的妙用!如何找到「缺失的第一个正数」
剑指 offer 第一题:二维数组中的查找
动画:什么是单调栈?
在数据结构中穿针引线:链表实现栈和队列
从简单的线性数据结构开始:栈与队列
五分钟学算法小知识:用栈实现队列/用队列实现栈
几道和「堆栈、队列」有关的面试算法题
超详细!图解「合并 K 个排序链表」
动画:面试如何轻松手写链表?
LeetCode 上最难的链表算法题,没有之一!
链表算法面试问题?看我就够了!
看动画轻松理解「链表」实现「LRU缓存淘汰算法」
从简单的线性数据结构开始:穿针引线的链表(一)
在数据结构中穿针引线:链表实现栈和队列
8、散列表 五分钟速读:什么是散列表(哈希表)?
什么是哈希洪水攻击(Hash-Flooding Attack)?
几道和散列(哈希)表有关的面试题
如何判断一个元素在亿级数据中是否存在?
9、树 面试前准备:二叉树高频面试题和答案
懵逼树上懵逼果:学习二分搜索树
LeetCode 二叉树问题小总结
从简单二叉树问题重新来看深度优先搜索
几道和「二叉树」有关的算法面试题
详解什么是平衡二叉树(AVL)(修订补充版)
【面试现场】为什么 MySQL 数据库要用B+树存储索引?
字典树概念与题型解析
面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?
心里没点 B 树。。。
数据结构与算法——最小生成树
植树节,程序猿种的那些树
数据结构与算法——2-3-4树
数据结构与算法——2-3树
看动画轻松理解「Trie树」
10、图 浅谈什么是图拓扑排序
数据结构与算法——图论基础与图存储结构
数据结构与算法:三十张图弄懂「图的两种遍历方式」
数据结构与算法——图最短路径
总结 学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。
如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。
基础系列 通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!
这些书籍需要你费点心思去阅读。
很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。
哎呀,要是文章的代码是 Java 语言就好了呀。
哎呀,要是文章的代码是 Python 语言就好了呀。
虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。
我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。
他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。
面试实战系列 大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。
所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。
《剑指 offer》这本书的目的非常明确,就是为了面试。
这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。
我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。
我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。
|