
数据结构与算法
文章平均质量分 84
本专栏文章参考中国大学MOOC网北京大学《数据结构与算法python版》
花_城
这个作者很懒,什么都没留下…
展开
-
数据结构与算法——31. 图的应用:拓扑排序、强连通分支、最短路径问题、最小生成树
文章目录一、拓扑排序(Topological Sort)实现思路二、强连通分支1. 转置的概念2. 强连通分支算法:Kosaraju算法思路三、最短路径问题1. 最短路径问题:Dijkstra算法2. python代码实现3. Dijkstra算法分析四、最小生成树1. 单播解法2. 洪水解法3. 最小生成树解法4. Prim算法一、拓扑排序(Topological Sort)很多问题都可转化为图, 利用图算法解决,例如制作煎饼的过程,以动作为顶点,以先后次序为有向边。但问题是如果一个人独自做,所有原创 2021-12-11 11:44:27 · 2094 阅读 · 0 评论 -
数据结构与算法——30. 广度、深度优先搜索及骑士周游问题
文章目录一、广度优先搜索(Breadth First Search,BFS)1. BFS算法过程2. python实现3. 算法分析二、图的应用:骑士周游问题1. 构建骑士周游图2. 骑士周游问题算法实现3. 骑士周游问题算法分析与改进(1)算法分析(2)算法改进4. 启发式规则(heuristic)三、深度优先搜索(Depth First Search,DFS)1. python代码实现2. 算法分析一、广度优先搜索(Breadth First Search,BFS)在前面的词梯问题中,在单词关系图建原创 2021-12-10 11:12:26 · 2962 阅读 · 1 评论 -
数据结构与算法——29. 图(Graph)的概念及应用
文章目录一、图(Graph)的概念1. 图的相关术语2. 图的定义二、图抽象数据类型(ADT Graph)1. 邻接矩阵实现图2. 邻接列表实现图3. python代码实现三、图的应用:词梯问题1. 构建单词关系图2. python代码实现一、图(Graph)的概念图Graph是比树更为一般的结构,也是由节点和边构成。而实际上树是一种具有特殊性质的图。图可以用来表示现实世界中很多事物:道路交通系统、航班线路、互联网连接、或者是大学中课程的先修次序。一旦我们对图相关问题进行了准确的描述,就可以采用处原创 2021-12-08 15:06:54 · 2619 阅读 · 0 评论 -
数据结构与算法——28. 平衡二叉查找树(AVL树)的定义与实现
文章目录一、平衡二叉查找树(AVL树)的定义二、AVL树的性能三、AVL树的python实现1. `put`方法2. `UpdateBalance`方法3. 重新平衡的思路4. `rotateLeft`左旋(右旋的代码与之相似)5. 更复杂的情形6. `rebalance`方法:重新平衡四、ADT Map的实现方法小结一、平衡二叉查找树(AVL树)的定义平衡二叉查找树(AVL树)是一种能够在key插入时一直保持平衡的二叉查找树。AVL是发明者的名字缩写:G.M. Adelson-Velskii an原创 2021-12-07 14:47:13 · 923 阅读 · 0 评论 -
数据结构与算法——27. 二叉查找树的实现及算法分析
文章目录一、二叉查找树(Binary Search Tree)二叉查找树BST的性质二、二叉查找树的实现(python代码)节点和链接结构1. `BST.put`方法2. `BST.__setitem__`方法3. `BST.get`方法4. `BST.__getitem__`和`BST.__contains__`方法5. TreeNode类的`__iter__`方法(迭代器)6. `BST.delete`方法7. `BST.remove`方法TreeNode类:寻找“后继”节点8. 完整代码三、算法分析(原创 2021-12-06 10:45:45 · 872 阅读 · 0 评论 -
数据结构与算法——26. 优先队列与二叉堆
文章目录一、优先队列(Priority Queue)二、二叉堆(Binary Heap)1. 完全二叉树2. 堆次序(Heap Order)三、二叉堆的python实现一、优先队列(Priority Queue)队列数据结构有一种变体称为“优先队列”。它的出队跟队列一样从队首出队;但在优先队列内部,数据项的次序却是由“优先级”来确定:高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。例如:银行窗口取号排队,VIP客户可原创 2021-12-04 19:11:12 · 847 阅读 · 2 评论 -
数据结构与算法——25. 树的遍历
文章目录树的遍历(Tree Traversals)python代码实现后序遍历:表达式求值中序遍历:生成全括号中缀表达式树的遍历(Tree Traversals)对一个数据集中的所有数据项进行访问的操作称为“遍历Traversal”。线性数据结构中,对其所有数据项的访问比较简单直接,按照顺序依次进行即可。树的非线性特点,使得遍历操作较为复杂。我们按照对节点访问次序的不同来区分3种遍历:前序遍历(preorder):先访问根节点,再递归地前序访问左子树、最后前序访问右子树;上图二叉树的前序遍历原创 2021-12-03 22:21:12 · 869 阅读 · 0 评论 -
数据结构与算法——24. 树的应用:表达式解析树
文章目录一、解析树(语法树)二、解析树实例:表达式解析1. 建立表达式解析树(1)建立表达式解析树的规则(2)建立表达式解析树的思路(3)python代码实现2. 表达式解析树的求值(1)增加程序可读性的技巧:函数引用(补充知识点)(2)python代码实现一、解析树(语法树)树结构可以用来分析句子的各种语法成分,对句子的各种成分进行处理。语法分析树:主谓宾,定状补;程序设计语言的编译:词法、语法的检查,从语法树生成目标代码;自然语言处理:机器翻译、语义理解。比如,表达式((7+3)∗(5−原创 2021-12-03 17:33:38 · 3661 阅读 · 0 评论 -
数据结构与算法——23. 用嵌套列表与链表实现树结构
文章目录一、树的嵌套列表实现1. 嵌套列表法的优点2. python代码实现树的链表实现python代码实现一、树的嵌套列表实现首先我们尝试用Python List来实现二叉树数据结构。递归的嵌套列表实现二叉树,每一个节点由具有3个元素的列表([root, left, right])实现:第1个元素为根节点的值;第2个元素是左子树或左子节点(也是一个列表);第3个元素是右子树或右子节点(也是一个列表)。比如,下图所示的二叉树,它的节点的python代码实现如图片下方所示:my_tree原创 2021-12-02 18:33:07 · 1783 阅读 · 0 评论 -
数据结构与算法——22. 树的概念及其相关术语
文章目录一、树(tree)的概念1. 树的例子:生物学的物种分类2. 树的例子:Unix文件系统3. 树的例子:HTML文档(DOM树)二、树结构的相关术语1. 树的定义12. 树的定义2(递归版本)一、树(tree)的概念树是一种基本的“非线性”数据结构,在计算机科学的各个领域中被广泛应用(操作系统、图形学、数据库系统、计算机网络)。跟自然界中的树一样,数据结构树也分为:根、枝和叶等三个部分。一般数据结构的图示把根放在上方,叶放在下方。1. 树的例子:生物学的物种分类分类树的第一个特征:分原创 2021-12-02 15:25:14 · 896 阅读 · 0 评论 -
数据结构与算法——21. 抽象数据类型:映射(Map)
文章目录一、抽象数据类型:映射(Map)二、实现ADT Mappython代码实现三、散列算法分析一、抽象数据类型:映射(Map)字典(Dict)是Python最有用的数据类型之一,可以保存key-vaule键值对,key可用于查询关联的数据值value。这种键值关联的方法称为“映射(Map)”。ADT(抽象数据类型) Map的结构是键-值关联的无序集合,关键码具有唯一性,通过关键码可以唯一确定一个数据值。二、实现ADT Map使用字典的优势在于,给定关键码key,能够很快得到关联的数据值valu原创 2021-12-01 21:41:51 · 1530 阅读 · 0 评论 -
数据结构与算法——20. 散列冲突的解决
文章目录冲突解决方案:一、开放定址(open addressing)1. 线性探测的改进2. 再散列(rehashing)冲突解决方案:二、数据项链表(Chaining)前面提到,如果说散列函数是完美的,那就不会有散列冲突,但完美散列函数常常是不现实的。如果两个数据项被散列映射到同一个槽,那么就产生了“冲突”。而使用一个系统化的方法在散列表中保存第二个数据项,这个过程称为“解决冲突”。解决散列冲突是散列方法中很重要的一部分。冲突解决方案:一、开放定址(open addressing)解决冲突的一原创 2021-12-01 16:21:27 · 1151 阅读 · 0 评论 -
数据结构与算法——19. 散列函数设计方法
文章目录一、散列(哈希)函数设计方法1. 折叠法2. 平方取中法二、散列函数设计:非数项总结一、散列(哈希)函数设计方法1. 折叠法折叠法设计散列函数的基本步骤:将数据项按照位数分为若干段;将几段数字相加;对散列表大小求余,得到散列值。例如:对于电话号码62767255,可以两位两位分为4段(62、76、72、55),相加(62+76+72+55=265),散列表包括11个槽,那么就是265%11=1。所以,h(62767255)=1h(62767255)=1h(62767255)=1。原创 2021-11-30 22:03:01 · 2567 阅读 · 0 评论 -
数据结构与算法——18. 散列的应用:区块链技术
文章目录散列的应用:区块链技术1. 区块2. 区块链的不可修改性3. 工作量证明4. 上限值5. 记账奖励散列的应用:区块链技术区块链是一种分布式数据库,通过网络连接各节点,每个节点都保存着整个数据库所有数据,任何地点存入的数据都会完成同步。区块链最本质特征是“去中心化”!不存在任何控制中心、协调中心节点,所有节点都是平等的,无法被控制。1. 区块区块链由一个个区块(block)组成,区块分为头(head)和体(body):区块头记录了一些元数据和链接到前一个区块的信息,元数据包括生成时间、前原创 2021-11-29 18:55:16 · 862 阅读 · 0 评论 -
数据结构与算法——17. 散列(哈希)与完美散列函数
文章目录一、散列(Hashing)的概念举例说明二、完美散列函数1. 数据的一致性校验2. 完美散列函数用于数据的一致性校验一、散列(Hashing)的概念在查找算法中,如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度。现在我们沿着这个思路,在存放数据时花点心思:构造一个新的数据结构,能使得查找算法的复杂度降到O(1)O(1)O(1)。如果我们事先能知道要找的数据项应该出现在数据集中的什么位置,就可以直接到那个位置看看数据项是否存在即可。于是,现在的问题就成了:如何由数据项的值来原创 2021-11-29 11:41:28 · 1043 阅读 · 0 评论 -
数据结构与算法——16. 快速排序
文章目录快速排序(Quick Sort)python代码实现算法分析排序算法可视化演示:传送门,这些演示可以帮助我们跟好的理解这些排序算法。下面的算法的实现,均以从小到大排序作为目的。快速排序(Quick Sort)快速排序的思路是依据一个“中值”数据项来把数据表分为两半:小于中值的一半和大于中值的一半,然后每部分分别进行快速排序(递归)。如果希望这两半拥有相等数量的数据项,则应该去找数据表的“中位数”充当“中值”。但找中位数需要计算开销,要想没有开销,只能随意找一个数来充当“中值”。比如,原创 2021-11-28 14:23:06 · 424 阅读 · 0 评论 -
数据结构与算法——15. 归并排序
文章目录归并排序(Merge Sort)python代码实现算法分析归并排序(Merge Sort)排序算法可视化演示:传送门,这些演示可以帮助我们跟好的理解这些排序算法。下面的算法的实现,均以从小到大排序作为目的。归并排序是递归算法,思路是将数据表持续分裂为两半,直到每一组剩下一个数据项为止。然后对每两组数据项分别进行排序,合并成一组,如此反复排序、合并……最终合并成一个表,完成排序。归并算法的递归三定律为:基本结束条件:数据表仅有1个数据项,自然是排好序的;缩小规模:将数据表分裂为相原创 2021-11-27 15:16:52 · 511 阅读 · 0 评论 -
数据结构与算法——13. 插入排序
文章目录插入排序(Insertion Sort)插入数据项的思路python代码实现算法分析排序算法可视化演示:传送门,这些演示可以帮助我们跟好的理解这些排序算法。下面的算法的实现,均以从小到大排序作为目的。插入排序(Insertion Sort)插入排序维护一个已排好序的子列表,这个子列表位置始终在列表的前部,然后逐步扩大这个子列表直到全表:第1趟,子列表仅包含第1个数据项,将第2个数据项作为“新项”插入到子列表的合适位置中,这样已排序的子列表就包含了2个数据项。第2趟,再继续将第3个原创 2021-11-25 17:33:28 · 960 阅读 · 0 评论 -
数据结构与算法——12. 冒泡排序和选择排序
文章目录一、冒泡排序(Bubble Sort)python代码实现算法分析改进冒泡排序算法二、选择排序(Selection Sort)python代码实现算法分析排序算法可视化演示:传送门,这些演示可以帮助我们跟好的理解这些排序算法。下面的算法的实现,均以从小到大排序作为目的。一、冒泡排序(Bubble Sort)冒泡排序的算法思路在于对无序表进行多趟比较交换。每趟包括了多次两两相邻比较,并将逆序的(小项在大项后面的)数据项互换位置,最终能将本趟的最大项就位。经过n-1趟比较交换,实现整表排原创 2021-11-25 15:32:00 · 1485 阅读 · 0 评论 -
数据结构与算法——11. 二分查找
文章目录二分查找1. python代码实现2. 递归算法实现3. 算法分析4. 二分查找的进一步思考二分查找对于有序表,我们有一种比顺序查找更加优秀的查找算法。那就是二分查找算法。假设有一个从小到大排序的列表。我们从列表中间的项进行对比,如果匹配查找项,则查找结束;如果不匹配,那么就有两种情况:列表中间项比查找项大,那么查找项只可能出现在前半部分;123579112536目标中间项列表中间项比查找项小,那么查找项只可能出现在后半部分。原创 2021-11-24 19:25:42 · 623 阅读 · 0 评论 -
数据结构与算法——10. 顺序查找
文章目录顺序查找1. 无序表的顺序查找python代码实现算法分析2. 有序表的顺序查找python代码实现算法分析顺序查找如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。在Python List中,这些数据项的存储位置称为下标(index),这些下标都是有序的整数,从零开始,到n-1结束(n为数据项的数量)。通过下标,我们就可以按照顺序来访问和查找数据项,这种技术称为“顺序查找”。1. 无序表的顺序查找对于无序表的查找,首先从列表的第1个数据项开始,按照下标增长的顺原创 2021-11-24 15:55:24 · 1969 阅读 · 1 评论 -
数据结构与算法——9. 找零问题的递归解法和动态规划解法
文章目录一、分治策略与递归算法1. 分治策略的概念2. 分治策略与递归算法的关系二、优化问题和贪心策略1. 优化问题2. 贪心策略3. 贪心策略失效三、找零问题的递归解法改进递归算法解决方案四、找零问题的动态规划解法1. 动态规划解法2. 动态规划中最主要的思想3. 找零兑换:动态规划算法扩展一、分治策略与递归算法1. 分治策略的概念分治策略是解决问题的典型策略:分而治之。将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。2. 分治策略与递归算法的关系递归算原创 2021-11-23 20:07:07 · 5720 阅读 · 0 评论 -
数据结构与算法——8. 递归的应用:汉诺塔
文章目录一、递归的应用:汉诺塔1. 什么是汉诺塔2. 神的旨意是千真万确的!3. 使用递归思想解决汉诺塔问题4. python代码实现一、递归的应用:汉诺塔1. 什么是汉诺塔汉诺塔问题是法国数学家Edouard Lucas于1883年,根据传说提出来的:传说在一个印度教寺庙里,有3根柱子,其中一根套着64个由小到大的黄金盘片,僧侣们的任务就是要把这一叠黄金盘从一根柱子搬到另一根,但有两个规则:一次只能搬1个盘子大盘子不能叠在小盘子上神的旨意说一旦这些盘子完成迁移寺庙将会坍塌,世界将会毁原创 2021-11-20 17:16:01 · 3392 阅读 · 0 评论 -
数据结构与算法——7. 递归:递归的概念与实现
文章目录一、递归( Recursion)的概念1. 递归的简单应用:数列求和问题使用循环算法解决使用递归算法解决2. 递归程序的执行过程3. 递归三定律二、递归调用的实现1. 递归与栈的关系2. Python对递归深度(递归调用次数)的限制一、递归( Recursion)的概念递归是一种解决问题的方法,其精髓在于将问题分解为规模更小的相同问题,持续分解,直到问题规模小到可以用非常简单直接的方式来解决。递归算法最显著的特征就是:在算法流程中调用自身。1. 递归的简单应用:数列求和问题给定一个列表,原创 2021-11-18 17:26:57 · 2064 阅读 · 0 评论 -
数据结构与算法——6. 抽象数据类型:无序表与有序表及其链表实现
文章目录一、无序表抽象数据类型列表(List)的概念二、采用链表实现无序表1. 链表2. 链表节点3. python实现链表节点4. python实现链表一、无序表抽象数据类型列表(List)的概念列表是一种数据项按照相对位置存放的数据集,有时也称为“无序表unordered list”,其中数据项只按照存放位置来索引,如第1个、第2个……、最后一个等。如一个考试分数的集合“54, 26, 93, 17, 77和31”,如果用无序表来表示,就是[54, 26, 93, 17, 77, 31]。二、原创 2021-11-17 16:22:22 · 1479 阅读 · 0 评论 -
数据结构与算法——5. 线性结构之队列(Queue)与双端队列(Deque)
文章目录一、队列(Queue)1. 队列的定义2. 队列的特性3. 使用python实现队列二、队列的应用:打印任务1. 实例2. 抽象建模3. python代码实现三、双端队列(Deque)1. 双端队列的定义2 .使用Python实现双端队列四、双端队列的应用:“回文词”判定1. “回文词”的概念2. “ 回文词”的判定方法3. python代码实现一、队列(Queue)1. 队列的定义队列是一种有次序的数据集合,其特征是新数据项的添加总发生在一端(通常称为“尾rear”端)而现存数据项的移除总原创 2021-11-16 17:30:03 · 1551 阅读 · 0 评论 -
数据结构与算法——4. 线性结构之栈(Stack)
文章目录一、栈(Stack)1. 栈的定义2. 栈的特性:反转次序3. 使用python实现栈二、栈的应用:括号的嵌套匹配1. 括号的使用规则2. 识别括号的嵌套是否正确一、栈(Stack)1. 栈的定义栈是一种有次序的数据项集合,在栈中,数据项的添加和移除都仅发生在同一端,这一端叫“栈顶stack top”。而另一端叫“栈底stack base”。在读取数据时,最后加入的数据项放在栈顶,会被第一个取出。而最先加入的数据项放在栈低,只能在所有数据项被取完后,最后一个取出。这种次序被称为“先进后出LI原创 2021-11-15 17:28:55 · 1075 阅读 · 0 评论 -
数据结构与算法——3. 线性结构的概念
文章目录一、线性结构(Linear Structure)1. 线性结构的定义2. 常见的线性结构一、线性结构(Linear Structure)1. 线性结构的定义线性结构是一种有序数据项的集合,其中的每个数据都有唯一的前驱和后继,除了第一个没有前驱,最后一个没有后继;新的数据项加入到数据集中时,只会加入到原有某个数据项之前或之后。2. 常见的线性结构线性结构有多种,根据数据项增减方式的不同,诞生了多种线性结构。有的只允许从一端添加,有的则允许从两端移除。其中,常见的有四种:栈(Stack)原创 2021-11-13 16:40:44 · 914 阅读 · 0 评论 -
数据结构与算法——2. 数据结构与算法的概念以及复杂度的渐进表示法
文章目录一、抽象数据类型与数据结构1. 对问题进行抽象2. 抽象数据类型(ADT)3. 什么是数据结构(Data Structure)二、算法和计算复杂性1. 什么是算法(Algorithm)2. 计算复杂性3. 算法和计算复杂性三、复杂度的表示方法1. 复杂度的类别2. 复杂度的渐进表示法四、算法分析窍门一、抽象数据类型与数据结构计算机科学不仅仅是对计算机的研究,更重要的是研究问题、问题解决过程、问题的解决方案。编程是通过一种程序设计语言,将抽象的算法实现为计算机可以执行的代码的过程,而最终的产原创 2021-11-10 21:22:56 · 1041 阅读 · 0 评论 -
数据结构与算法——1. 问题求解的计算之道和图灵机计算模型
文章目录一、问题求解的计算之道1. 基于有穷观点的能行方法2. 关于“计算”的几种数学模型二、图灵机计算模型1. 图灵机(Turing Machine)基本概念2. 图灵机的基本定义一、问题求解的计算之道人们在生活、生产、学习、创造的过程中总会遇到各种各样的问题。为了解决这些问题,人们使用占卜、求神、经验、数学、实验、模型、哲学等各种各样的方法和工具。而其中数学才是解决问题最强有力的工具,尽管数学本身也存在着很多问题(有些问题无法用数学语言明确表述、或者有些可明确表述的问题仍无法解决)。1. 基于有穷原创 2021-11-09 14:34:32 · 1299 阅读 · 0 评论