
算法导论
算法导论,第三版基础知识学习
BGoodHabit
这个作者很懒,什么都没留下…
展开
-
面试编程基础题python实现
代码:面试编程基础题python实现原创 2020-10-05 19:37:38 · 316 阅读 · 0 评论 -
第25章《所有节点对的最短路径》: Floyd-Warshall算法,python实现
最短路径本节讨论有向图G=(V,E)G=(V,E)G=(V,E)上所有节点对最短路径问题的一种动态规划算法。对于图G=(V,E)G=(V,E)G=(V,E)的所有节点对最短路径问题,一条最短路径的所有子路径都是最短路径。Floyd-Warshall算法我们使用一种不同的动态规划公式来解决所有节点对最短路径问题。所产生的算法称为Floyd-Warshall算法。Floyd-Warshall算法对带权重的无向图和有向图都起作用,但是图中不能有环中各边权重之和为负数的环路。假设有一个graph图如下:原创 2020-08-02 10:38:39 · 809 阅读 · 0 评论 -
第24章《单源最短路径》:Bellman-Ford和Dijkstra算法,python实现
Bellman-Ford算法Bellman-Ford算法解决的是一般情况下的单源最短路径问题,在这里,边的权重可以为负值。给定带权重的有向图G=(V,E)G=(V,E)G=(V,E)和权重函数w:E−Rw: E-Rw:E−R,Bellman-Ford算法返回一个布尔值,以表明是否存在一个从源节点可以到达的权重为负值的环路,如果存在这样一个环路,算法将告诉我们不存在解决方案,如果没有这种环路存在,算法将给出最短路径和它们的权重。Bellman-Ford算法实现步骤:Step 1:从带有权重的图开始原创 2020-07-20 08:59:30 · 1246 阅读 · 0 评论 -
第23章《最小生成树》: Kruskal和Prim算法,python实现
最小生成树假设一个连通无向图G=(V,E)G=(V,E)G=(V,E),其中每条边(u,v)∈E(u,v) \in E(u,v)∈E,我们为其赋予权重w(u,v)w(u,v)w(u,v),我们希望找到一个无环子集T⊆ET \subseteq ET⊆E,既能够将所有的节点连接起来,又具有最小的权重。即w(T)=∑(u,v)∈Tw(u.v)w(T)=\sum_{(u,v) \in T}w(u.v)w(T)=∑(u,v)∈Tw(u.v)的值最小。由于TTT是无环的,并且连通所有的节点,因此,TTT必然是一棵树原创 2020-06-28 13:48:40 · 753 阅读 · 1 评论 -
第22章《基本的图算法》: 图的深度优先和广度优先搜索,python实现
图的表示对于图G=(V,E)G=(V,E)G=(V,E),可以用两种标准的表示方法表示,一种表示法将图作为邻接链表的组合,另外一种表示法则将图作为邻接矩阵来看待。两种表示方法既可以表示无向图,也可以表示有向图。表示稀疏图(边的条数∣E∣|E|∣E∣远远小于∣V∣2|V|^2∣V∣2的图)邻接链表更有优势。但如果稠密图(∣E∣|E|∣E∣接近∣V∣2|V|^2∣V∣2的图)的情况下,可能更倾向于使用邻接矩阵表示,如果需要快速判断任意两个节点之间是否有边相连,可能也需要使用邻接矩阵表示图。邻接链表对于图G原创 2020-06-20 11:05:07 · 451 阅读 · 1 评论 -
第18章《B树》:b树python实现
B树B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但它们在降低磁盘I/O操作数方面要更好些。许多数据库系统使用B树或者B树的变种来存储信息。B树与红黑树的不同之处在于B树的节点可以有很多孩子,从数个到数千个。B树的定义...原创 2020-05-24 10:52:16 · 2751 阅读 · 0 评论 -
第16章《贪心算法》:赫夫曼树,python实现
贪心算法求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更简单,更高效的算法。贪心算法(greedy algorithm)就是这样的算法,它在每一步都做出当时看起来最佳的选择,也就是说,它总是做出局部最优的选择。贪心选择性质我们可以通过做出局部最优(贪心)选择来构造全局最优解,当进行选择时,我们直接做出当前问题中看来最优的选择,而不必考虑子问题的解,一个贪心算法通常是自顶向下的,进行一次又一次选择,将给定问原创 2020-05-13 15:13:09 · 1141 阅读 · 0 评论 -
第15章《动态规划》:动态规划求解钢条切割问题,python实现
动态规划动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解原问题。动态规划方法通常用来求解最优问题(optimization problem),这类问题可以有很多可行解,每个解都有一个值,我们希望寻找具有最优值(最小值或最大值)的解,我们称这样的解为问题的一个最优解,而不是最优解,因为可能有多个解都达到最优值。我们通常按如下4个步骤来设计一个动态规划...原创 2020-05-10 18:18:41 · 922 阅读 · 0 评论 -
第14章《数据结构的扩张》:如何扩张数据结构
如何扩张数据结构对基本数据进行扩张以支持一些附加功能,在算法设计过程中是相当常见的。所以扩张一种数据结构大概可以分为如下4个步骤:选择一种基础数据结构确定基础数据结构中要维护的附加信息检验基础数据结构上的基本修改操作能否维护附加信息设计一些新操作以上仅作为一个一般模式,大多数的设计工作都包含试探和纠错的成分,过程中所有步骤通常可以并行进行区间树扩张红黑树来支持由区间构成的动态集...原创 2020-05-06 11:05:36 · 562 阅读 · 0 评论 -
第13章《红黑树》:红黑树的简单介绍
红黑树红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是RED或BLACK。树中每个节点包含5个属性:color、key、left、right和p,如果一个节点没有子节点或父节点,则该节点相应指针属性的值为NIL,一棵红黑树满足下面红黑性质的二叉搜索树:每个节点或是红色的,或是黑色的根节点是黑色的每个叶节点(NIL)是黑色的如果一个节点是红色的,则它的两个子...原创 2020-05-05 15:15:08 · 269 阅读 · 0 评论 -
第12章《二叉搜索树》:二叉搜索树构建,遍历等python实现
什么是二叉搜索树一颗二叉搜索树是以一颗二叉树来组织的,如下图所示,这样一颗树可以使用一个链表数据结构来表示,其中每个节点就是一个对象,每个节点有自己的key,还包含属性left、right和pleft{、} right{和} pleft、right和p,分别指向节点的左孩子、右孩子和双亲,如果某个孩子节点和父节点不存在,则相应属性值为NILNILNIL,根节点是树中唯一父指针为NILNILNIL...原创 2020-05-01 18:06:52 · 570 阅读 · 0 评论 -
第11章《散列表》:基于双重散列的开放寻址法 python实现
散列表在直接寻址方式中,具有关键字kkk的元素被存放在槽kkk中,在散列方式下,该元素存放在槽h(k)h(k)h(k)中,即利用散列函数hhh,由关键字kkk计算出槽的位置。函数hhh将关键字的全域UUU映射到散列表T[0..m−1]T[0..m-1]T[0..m−1]的槽位上,这里散列表的大小mmm一般要比∣U∣|U|∣U∣小的多,下图描述了这个基本方法。这里存在一个问题,两个关键字可能映...原创 2020-04-28 14:38:22 · 575 阅读 · 0 评论 -
第10章《基本数据结构》:栈、队列、双向链表,python实现
栈和队列栈和队列都是动态集合,栈(stack)实现的是一种后进先出策略,而队列实现的是一种先进先出策略栈:栈上的insert操作称为压入(push),而无元素的delete操作称为弹出(pop),如下图所示,可以用一个数组S[1..n]S[1..n]S[1..n]来实现一个最多容纳nnn个元素的栈,该数组有一个属性S.topS.topS.top,指向最新插入元素,栈中包含的元素为S[1..S...原创 2020-04-24 09:20:47 · 253 阅读 · 0 评论 -
第9章《中位数和顺序统计量》:选择算法,python实现
选择算法本节介绍一种解决选择问题的分治算法,以快速排序算法为模型,与快速排序算法一样,我们仍然将输入数组进行递归划分,但与快速排序算法不同的是,快速排序会递归处理划分的两边,而选择算法只处理划分的一边,快速排序期望的运行时间为O(nlgn)O(nlgn)O(nlgn),而选择算法期望的运行时间为O(n)O(n)O(n)python实现代码如下,它返回数组A[p..r]A[p..r]A[p..r...原创 2020-04-20 10:10:44 · 304 阅读 · 0 评论 -
第8章《线性时间排序》:计数排序和桶排序,python实现
比较排序快速排序,归并排序,堆排序等这些算法都有一个有趣的性质,在排序的最终结果中,各元素的次序依赖于它们之间的比较,我们把这类算法称为比较排序,任何比较排序在最坏情况下,都要经过Ω(nlgn)\Omega(nlgn)Ω(nlgn)次比较,归并排序和堆排序是渐进最优的,并且任何已知的比较排序最多就是在常数因子上优于它们决策树模型:比较排序可以抽象为一颗决策树,决策树是一颗完全二叉树,它可以表...原创 2020-04-19 21:49:24 · 208 阅读 · 0 评论 -
第7章《快速排序》:快速排序,python实现
快速排序快速排序是一种最坏情况时间复杂度为O(n2)O(n^2)O(n2)的排序算法,虽然最坏情况时间复杂度很差,但是快速排序通常在实际应用中最好的选择,因为它的平均性能很好,它的期望复杂度是O(nlgn)O(nlgn)O(nlgn),另外,它还能够进行原址排序算法思想:快速排序也使用了分治思想,通过分解,将数组A[p..r]A[p..r]A[p..r]划分两个子数组A[p..q−1]A[p...原创 2020-04-16 10:54:37 · 275 阅读 · 0 评论 -
第6章《堆排序》:堆排序,python实现
堆定义:堆是一个数组,它可以看成一个近似的完全二叉树,树上的每个节点对应数组中的一个元素,除了最底层外,该数是完全充满的,而且是从左向右充满,如下图所示:基本性质:给定一个节点的下标iii,则它的父节点⌊i/2⌋\lfloor i/2 \rfloor⌊i/2⌋,左孩子:2i2i2i,右孩子:2i+12i+12i+1最大堆:A[parent(i)]≥A[i]A[parent(i)] \ge...原创 2020-04-15 08:51:22 · 448 阅读 · 0 评论 -
第5章《概率分析和随机算法》:随机排列数组,python实现
随机排列数组问题描述:假定给定一个数组AAA,包含n个元素,构造这个数组的一个随机排列思路:为数组AAA中的每个元素赋一个随机的优先级,然后依据优先级对随机数组AAA进行排列python实现:# -*-coding:utf8 -*-import sysimport randomdef permute_by_sorting(A): n = len(A) P = list() ...原创 2020-04-12 16:57:54 · 262 阅读 · 0 评论 -
第4章《分治策略》:最大子数组问题,python实现
最大子数组问题问题:求解一个数组中最大之和的连续子数组思路:分治策略求解算法,算法复杂度 O(nlgn)O(nlgn)O(nlgn)分析:数组A[low,high]A[low, high]A[low,high](假设mid是数组A的中间位置)的任何连续子数组A[i..j]A[i..j]A[i..j]所处的位置必然是以下三种情况之一:完全位于子数组A[low..mid]A[low..mid...原创 2020-04-12 16:18:08 · 778 阅读 · 0 评论 -
第3章《函数的增长》:渐进记号和常用函数
渐进记号Θ记号:若存在正常量c1和c2,使得对于足够大的n,函数f(n)能“夹入”c1g(n)和c2g(n)之间,则f(n)属于集合Θ(g(n));Θ记号给出了一个函数的上界和下界O记号:当函数只有一个渐进上界时,用O记号,存在常量c和n0,使得对所有n>=n0,有0<=f(n)<=c*g(n);O记号给出了一个函数的上界Ω记号:2级标题3级标题四级标题五级标...原创 2020-04-11 14:52:10 · 381 阅读 · 0 评论 -
第2章《算法基础》:插入排序,归并排序,python实现
本章主要介绍了两个基础排序算法,插入排序和归并排序算法,接下来用python语言对这两个算法进行实现。插入排序算法思路:类似打牌场景,从桌子上每次抽取一张牌,然后从右往左扫描我们手中的牌,一一进行对比(手中的牌已排好序),然后插入到适中位置def insert_sort(A): for i in range(1,len(A)): key = A[i] j = i - 1 whi...原创 2020-04-09 10:05:15 · 297 阅读 · 0 评论 -
第1章《算法在计算中的作用》:算法的定义
什么是算法?给定输入,通过算法,组织好每一步计算过程,把输入转换成输出的计算步骤的一个序列算法的作用?高效的算法可以让计算机在计算较大问题规模时,计算时间大大缩短,存储空间最小化...原创 2020-03-14 15:23:32 · 210 阅读 · 0 评论