![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法
数据结构与算法的python实现
LaiYoung1022
大数据系统
数据分析与挖掘
服务端开发
python使用
机器学习
深度学习
展开
-
【数据结构与算法python】强连通分治算法-Kosaraju算法
1、引入在生活中,可以发现在某些图中,如web底层结构、人际关系网,在图中可以发现高度聚集节点群的算法, 即寻找**“强连通分支Strongly Connected Components”算法。强连通分支, 定义为图G的一个子集C,C中的任意两个顶点v,w之间都有路径来回**,即(v,w)(w,v)都是C的路径,而且C是具有这样性质的最大子集。下图是具有3个强连通分支的9顶点有向图一旦找到强连通分支, 可以据此对图的顶点进行分类, 并对图进行化简。2、功能分析(1)转置概念在用深度优先搜索来原创 2020-09-11 09:10:55 · 742 阅读 · 0 评论 -
【数据结构与算法python】最短路径算法-Dijkstra算法
1、引入当我们通过网络浏览网页、 发送电子邮件、 QQ消息传输的时候, 数据会在联网设备之间流动, 如图, 当PC上的浏览器向服务器请求一个网页时, 请求信息需要:先通过本地局域网,由路由器A发送到Internet,请求信息沿着Internet中的众多路由器传播,最后到达服务器本地局域网所属的路由器B,从而传给服务器。我们可以将互联网路由器体系表示为一个带权边的图,路由器作为顶点,路由器之间网络连接作为边,权重可以包括网络连接的速度、网络负载程度、分时段优先级等影响因素,作为一个抽象,我们把所有影响因原创 2020-09-11 09:10:39 · 500 阅读 · 0 评论 -
【数据结构与算法python】最小生成树算法-Prim算法
1、引入本算法涉及到在互联网中网游设计者和网络收音机所面临的问题:信息广播问题,如网游需要让所有玩家获知其他玩家所在的位置,收音机则需要让所有听众获取直播的音频数据2、算法介绍(1)单播解法信息广播问题最简单的解法是由广播源维护一个收听者的列表, 将每条消息向每个收听者发送一次,如图,每条消息会被发送4次,每个消息都采用最短路径算法到达收听者路由器A会处理4次相同消息, C仅会处理1次;而B/D位于其它3个收听者的最短路径上, 则各会处理转发3次相同消息,会产生许多额外流量(2)洪水解法信息原创 2020-09-11 09:10:25 · 531 阅读 · 0 评论 -
【数据结构与算法python】图及算法总结
1、图的定义及相关术语2、图的实现3、广度优先搜索算法——词梯问题(无权图最短路径)——BFS4、深度优先搜索算法——骑士周游问题——针对性的DFS算法5、拓扑排序算法——关联任务排序——普遍DFS算法6、强连通分治算法——简化图——Kosaraju算法7、最短路径算法——有权图最短路径——Dijkstra算法8、最小生成树算法——广播消息——prim算法...原创 2020-09-11 09:10:12 · 428 阅读 · 0 评论 -
【数据结构与算法python】斐波那契数列的多种解决方案(递归、改进后的递归、动态规划)
1、引入(leecode试题)2、解决方案(1)传统解法def climbStairs(n): f1, f2 = 1, 2 while n > 1: f1, f2 = f2, f1 + f2 n -= 1 return f1(2)递归解法def climbStairs(n): if n==1: return 1 elif n==2: return 2 else:原创 2020-09-03 17:57:43 · 378 阅读 · 1 评论 -
【数据结构与算法python】动态规划算法
1、概念解释2、主要思想从最简单情况开始到达所需找零的循环,其每一步都依靠以前的最优解来得到本步骤的最优解,直到得到答案。3、例子(1)找零兑换问题1)引入2)代码实现在这里插入代码片(2)图书馆大盗问题1)引入2)代码实现...原创 2020-09-03 16:13:31 · 288 阅读 · 0 评论 -
【数据结构与算法python】递归算法的记忆化存储
1、引入(找零兑换问题 )假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币;假设某次顾客投进$1纸币,买了ȼ37的东西,要找ȼ63,那么最少数量就是: 2个quarter(ȼ25)、 1个dime(ȼ10)和3个penny(ȼ1),一共6个...原创 2020-09-03 15:57:27 · 1019 阅读 · 0 评论 -
【数据结构与算法python】贪心策略
1、引入(找零兑换问题 )假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币;假设某次顾客投进$1纸币,买了ȼ37的东西,要找ȼ63,那么最少数量就是: 2个quarter(ȼ25)、 1个dime(ȼ10)和3个penny(ȼ1),一共6个2、思想从最大面值的硬币开始,用尽量多的数量有余额的,再到下一最大面值的硬币,还用尽量多的数量,一直到penny(ȼ1)为止 。因为我们每次都试图解决问题的尽量大的一部分对应到兑换硬币问题,就是每次以最多数量的最大面值硬币来迅速减少找零面值原创 2020-09-03 15:37:13 · 224 阅读 · 0 评论 -
【数据结构与算法python】分治策略
1、概念解释将问题分为若干更小规模的部分,通过解决每一个小规模部分问题,并将结果汇总,得到原问题的解,如下图所示2、递归算法与分治策略间的关系(1)递归三定律基本结束条件,解决最小规模问题缩小规模,向基本结束条件演进调用自身来解决已缩小规模的相同问题(2)关系体现了分治策略,问题解决依赖于若干缩小了规模的问题,汇总得到原问题的解3、应用排序、查找、遍历、求值等等...原创 2020-09-03 15:26:15 · 198 阅读 · 0 评论 -
【数据结构与算法python】递归算法的python实现
1、概念解释2、实现原理(1)累加和(2)进制转换3、例子(1)分形树(2)谢尔宾斯基三角形(3)汉诺塔原创 2020-09-03 00:07:02 · 629 阅读 · 0 评论 -
【数据结构与算法python】查找排序算法总结
一、查找算法算法名称算法复杂度算法详解链接顺序查找(无序表)O(n)【数据结构与算法python】顺序查找算法的python实现(无序表)顺序查找(有序表)O(n)【数据结构与算法python】顺序查找算法的python实现(有序表)二分查找O(log(n))【数据结构与算法python】二分查找算法的python实现哈希查找O(1)【数据结构与算法python】哈希查找算法的python实现二、排序算法算法名称算法复杂度算法详解原创 2020-09-03 00:07:13 · 223 阅读 · 0 评论 -
【数据结构与算法python】快速排序算法的python实现
1、概念解释(1)思路快速排序的思路是依据一个“中值”数据项来把数据表分为两半:小于中值的一半和大于中值的一半, 然后每部分分别进行快速排序(递归)如果希望这两半拥有相等数量的数据项,则应该找到数据表的“中位数”但找中位数需要计算开销!要想没有开销,只能随意找一个数来充当“中值”比如,第1个数。(2)递归三要素快速排序的递归算法“递归三要素”如下基本结束条件:数据表仅有1个数据项,自然是排好序的缩小规模:根据“中值”, 将数据表分为两半, 最好情况是相等规模的两半调用自身:将两半分别调用自身原创 2020-09-02 16:09:18 · 236 阅读 · 0 评论 -
【数据结构与算法python】归并排序算法的python实现
1、概念解释归并排序是递归算法, 思路是将数据表持续分裂为两半, 对两半分别进行归并排序递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的;缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;调用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表2、代码实现方法一:def mergeSort(alist): print("Splitting ",alist) # 递归结束条件 if len(alist)>1:原创 2020-09-02 15:46:50 · 406 阅读 · 1 评论 -
【数据结构与算法python】谢尔排序算法的python实现
1、概念解释我们注意到插入排序的比对次数, 在最好的情况下是O(n), 这种情况发生在列表已是有序的情况下, 实际上, 列表越接近有序, 插入排序的比对次数就越少。 从这个情况入手, 谢尔排序以插入排序作为基础, 对无序表进行“间隔”划分子列表, 每个子列表都执行插入排序。随着子列表的数量越来越少, 无序表的整体越来越接近有序, 从而减少整体排序的比对次数,以间隔等于3为例,子列表分别插入排序后的整体状况更接近有序最后一趟是标准的插入排序, 但由于前面几趟已经将列表处理到接近有序, 这一趟仅需少数原创 2020-09-02 15:30:43 · 239 阅读 · 0 评论 -
【数据结构与算法python】插入排序算法的python实现
1、概念解释插入排序维持一个已排好序的子列表, 其位置始终在列表的前部, 然后逐步扩大这个子列表直到全表第1趟, 子列表仅包含第1个数据项, 将第2个数据项作为“新项”插入到子列表的合适位置中, 这样已排序的子列表就包含了2个数据项第2趟, 再继续将第3个数据项跟前2个数据项比对, 并移动比自身大的数据项, 空出位置来, 以便加入到子列表中经过n-1趟比对和插入, 子列表扩展到全表, 排序完成2、代码实现def insertionSort(alist): for index in r原创 2020-09-02 15:03:31 · 222 阅读 · 0 评论 -
【数据结构与算法python】选择排序算法的python实现
1、概念解释选择排序对冒泡排序进行了改进, 保留了其基本的多趟比对思路, 每趟都使当前最大项就位。 选择排序对冒泡排序进行了改进, 保留了其基本的多趟比对思路, 每趟都使当前最大项就位。以下以图示的方式展示选择排序算法的实现过程2、代码实现def selectionSort(alist): for fillslot in range(len(alist)-1,0,-1): positionOfMax=0 for location in range(1,fillsl原创 2020-09-02 14:29:42 · 218 阅读 · 0 评论 -
【数据结构与算法python】冒泡排序算法的python实现
1、概念解释冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位 ,经过n-1趟比较交换, 实现整表排序 ,每趟的过程类似于“气泡”在水中不断上浮到水面的经过,因此称之为“冒泡排序算法”第1趟比较交换, 共有n-1对相邻数据进行比较,一旦经过最大项,则最大项会一路交换到达最后一项第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较直到第n-1趟完成后, 最小项一定在列表 首位,原创 2020-09-02 14:24:19 · 380 阅读 · 0 评论 -
【数据结构与算法python】哈希查找算法的python实现
1、Hashing在文章《【数据结构与算法python】顺序查找算法的python实现(无序表)》与《【数据结构与算法python】顺序查找算法的python实现(有序表)中,我们利用数据集中关于数据项之间排列关系的知识, 来将查找算法进行了提升,如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度。为了进一步降低算法的复杂度,构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为“哈希Hashing”能够使得查找的次数降低到常数级别, 我们对数据项所处的位置就必原创 2020-09-02 12:15:41 · 1459 阅读 · 0 评论 -
【数据结构与算法python】二分查找算法的python实现
1、概念解释在顺序查找中, 如果第1个数据项不匹配查找项的话, 那最多还有n-1个待比对的数据项 ,我们可以引入二分查找算法,利用有序表的特性,迅速缩小待比对数据项的范围。我们从列表中间开始比对!如果列表中间的项匹配查找项,则查找结束如果不匹配,那么就有两种情况:• 列表中间项比查找项大,那么查找项只可能出现在前半部分• 列表中间项比查找项小,那么查找项只可能出现在后半部分无论如何,我们都会将比对范围缩小到原来的一半: n/22、代码实现(1)实现方式一:更改二分法的首尾坐标位置def b原创 2020-09-02 10:40:48 · 313 阅读 · 0 评论 -
【数据结构与算法python】顺序查找算法的python实现(有序表)
1、概念解释在文章《【数据结构与算法python】顺序查找算法的python实现(无序表)》中,我们利用顺序查找算法对元素在无序表中的查找进行了分析,现在如果考虑数据项已完成排序, 该如何实现顺序查找算法。当数据项存在时,比对过程与无序表完全相同不同之处在于,如果数据项不存在,比对可以提前结束 。如下图中查找数据项50,当看到54时,可知道后面不可能存在50,可以提前退出查找 。2、代码实现def orderedSequentialSearch(alist, item): pos =原创 2020-09-02 10:20:57 · 345 阅读 · 0 评论 -
【数据结构与算法python】顺序查找算法的python实现(无序表)
1、概念解释如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。2、代码实现3、算法分析原创 2020-09-02 10:07:34 · 688 阅读 · 0 评论 -
【数据结构与算法python】拓扑排序算法-DFS算法
1、引入很多问题都可转化为图, 利用图算法解决,例如早餐吃薄煎饼的过程,以动作为顶点,以先后次序为有向边,问题是对整个过程而言,如果一个人独自做,所有动作的先后次序?从加料开始?还是从加热烤盘开始?2、分析从工作流程图得到工作次序排列的算法,称为“拓扑排序”,拓扑排序处理一个DAG, 输出顶点的线性序列,使得两个顶点v,w,如果G中有(v,w)边,在线性序列中v就出现在w之前。拓扑排序广泛应用在依赖事件的排期上,还可以用在项目管理、 数据库查询优化和矩阵乘法的次序优化上。拓扑排序可以采用DFS原创 2020-09-10 21:13:42 · 852 阅读 · 0 评论 -
【数据结构与算法python】深度优先搜索算法
1、引入在一个国际象棋棋盘上, 一个棋子“马”(骑士) , 按照“马走日”的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次。把一个这样的走棋序列称为一次“周游” 。2、功能分析在8×8的国际象棋棋盘上, 合格的“周游”数量有1.305×1035这么多, 走棋过程中失败的周游就更多了。采用图搜索算法, 是解决骑士周游问题最容易理解和编程的方案之一解决方案还是分为两步:首先将合法走棋次序表示为一个图采用图搜索算法搜寻一个长度为(行×列-1)的路径,路径上包含每个顶点恰一次(1)构建骑士原创 2020-09-10 20:46:19 · 1382 阅读 · 0 评论 -
【数据结构与算法python】广度优先搜索算法
1、引入由 “ 爱 丽 丝 漫 游 奇 境 ” 的 作 者 LewisCarroll在1878年所发明的单词游戏,从一个单词演变到另一个单词, 其中的过程可以经过多个中间单词,要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE:FOOL >> POOL >> POLL >> POLE >> PALE>> SALE >> SAGE2、功能分析在上述问题中,我们的目标是找到最短的单词变换序列采用图来解决这个问题的步骤原创 2020-09-10 19:55:24 · 479 阅读 · 0 评论 -
【数据结构与算法python】图的实现
1、实现方法ADT Graph的实现方法有两种主要形式:邻接矩阵adjacency matrix与邻接表adjacency list,两种方法各有优劣,需要在不同应用中加以选择(1)邻接矩阵Adjacency Matrix矩阵的每行和每列都代表图中的顶点,如果两个顶点之间有边相连, 设定行列值,无权边则将矩阵分量标注为1,或者0,带权边则将权重保存为矩阵分量值右下图可用左下的邻接矩阵表示邻接矩阵实现法的优点是简单,可以很容易得到顶点是如何相连,但如果图中的边数很少则效率低下,成为“稀疏sparse原创 2020-09-10 18:26:04 · 445 阅读 · 0 评论 -
【数据结构与算法python】图的定义及相关术语
1、定义图Graph是比树更为一般的结构, 也是由节点和边构成,实际上树是一种具有特殊性质的图图可以用来表示现实世界中很多事物,如道路交通系统、航班线路、互联网连接、或者是大学中课程的先修次序一个图G可以定义为G=(V, E)其中V是顶点的集合, E是边的集合, E中的每条边e=(v, w), v和w都是V中的顶点;如果是赋权图,则可以在e中添加权重分量子图: V和E的子集2、相关术语(1)顶点Vertex(也称“节点Node”)图的基本组成部分,顶点具有名称标识Key,也可以携带数据项pay原创 2020-09-10 17:03:40 · 436 阅读 · 0 评论 -
【数据结构与算法python】树的应用(表达式解析与计算)
1、引入我们可以将表达式表示为树结构叶节点保存操作数,内部节点保存操作符,如下图所示全括号表达式((7+3)(5-2))由于括号的存在,需要计算的话,就必须先计算7+3和5-2,表达式层次决定计算的优先级,越底层的表达式,优先级越高树中每个子树都表示一个子表达式,将子树替换为子表达式值的节点,即可实现求值2、功能分析(1)构建表达式解析树下面, 我们用树结构来做如下尝试从全括号表达式构建表达式解析树利用表达式解析树对表达式求值从表达式解析树恢复原表达式的字符串形式❖首先, 全括号表原创 2020-09-10 16:40:11 · 2395 阅读 · 2 评论 -
【数据结构与算法python】平衡二叉查找树(AVL树)的实现
1、定义二叉树的构建过程中,若元素的插入先后顺序不同,则会影响二叉树最终的结构,因此引入在key插入时一直保持平衡的二叉查找树: AVL树。AVL是发明者的名字缩写: G.M. AdelsonVelskii and E.M. Landis。利用AVL树实现ADT Map, 基本上与BST的实现相同,不同之处仅在于二叉树的生成与维护过程AVL树的实现中, 需要对每个节点跟踪“平衡因子balance factor”参数平衡因子是根据节点的左右子树的高度来定义的, 确切地说, 是左右子树高度差: bala原创 2020-09-10 16:14:35 · 491 阅读 · 0 评论 -
【数据结构与算法python】二叉查找树的实现
1、定义2、性质3、功能分析4、代码实现5、测试代码及结果原创 2020-09-10 15:18:41 · 291 阅读 · 0 评论 -
【数据结构与算法python】完全二叉树的实现(优先队列和二叉堆)
1、引入前面我们学习了一种FIFO数据结构队列,队列有一种变体称为“优先队列”。如银行窗口取号排队, VIP客户可以插到队首,操作系统中执行关键任务的进程或用户特别指定进程在调度队列中靠前优先队列的出队跟队列一样从队首出队;但在优先队列内部, 数据项的次序却是由“优先级”来确定:高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。实现优先队列的经典方案是采用二叉堆数据结构二叉堆能够将优先队列的入队和出队复杂度都原创 2020-09-09 17:31:20 · 419 阅读 · 0 评论 -
【数据结构与算法python】树的遍历
1、定义对一个数据集中的所有数据项进行访问的操作称为“遍历Traversal”,线性数据结构中, 对其所有数据项的访问比较简单直接,按照顺序依次进行即可。树的非线性特点, 使得遍历操作较为复杂,需要采用一种比较特殊的方式来完成。2、分类按照对节点访问次序的不同来区分3种遍历前序遍历(preorder):先访问根节点,再递归地前序访问左子树、最后前序访问右子树;中序遍历(inorder):先递归地中序访问左子树,再访问根节点,最后中序访问右子树;后序遍历(postorder):先递归地后序访问左原创 2020-09-09 16:43:11 · 261 阅读 · 0 评论 -
【数据结构与算法python】树的实现
方法一:树的嵌套列表实现1、定义借助Python List来实现二叉树树数据结构,采用递归的嵌套列表实现二叉树, 由具有3个元素的列表实现:[root,left,right]第1个元素为根节点的值;第2个元素是左子树(所以也是一个列表);第3个元素是右子树(所以也是一个列表)。以下图为例,一个6节点的二叉树根是myTree[0],左子树myTree[1],右子树myTree[2]该树的嵌套列表表示方式如下:tree = ['a', ['b', ['d',[],[]],原创 2020-09-09 15:40:25 · 957 阅读 · 1 评论 -
【数据结构与算法python】树的定义与相关术语
1、概念之前学习的链表、顺序表都属于线性结构,数据结构中还存在另外一种结构——非线性结构,包含树与表,树在计算机科学的各个领域中被广泛应用,如操作系统、图形学、数据库系统、计算机网络,其次跟自然界中的树一样, 数据结构树也分为:根、 枝和叶等三个部分,一般数据结构的图示把根放在上方,叶放在下方。2、定义(1)定义1树由若干节点, 以及两两连接节点的边组成, 并有如下性质其中一个节点被设定为根;每个节点n(除根节点),都恰连接一条来自节点p的边, p是n的父节点;每个节点从根开始的路径是唯一的原创 2020-09-09 14:52:49 · 212 阅读 · 0 评论 -
【数据结构与算法python】树及算法总结
1、树的定义与相关术语2、树的实现(包含链表实现和嵌套链表实现)3、树的遍历(前序遍历、中序遍历、后序遍历)4、完全二叉树的实现(优先队列和二叉堆)5、二叉查找树的实现6、平衡二叉查找树(AVL树)的实现...原创 2020-09-10 16:44:38 · 196 阅读 · 0 评论 -
【数据结构与算法python】有序链表的python实现
1、有序链表的介绍有序表是一种数据项依照其某可比性质(如整数大小、字母表先后)来决定在列表中的位置2、有序链表的性质与无序链表相比较,有序链表中,越“小”的数据项越靠近列表的头,越靠“前”3、有序链表的基本操作(1)节点Nodeclass Node: # 链表初始化 def __init__(self,initdata): self.data = initdata self.next = None # 获取节点的值 def getData(se原创 2020-08-31 00:12:09 · 722 阅读 · 3 评论 -
【数据结构与算法python】无序链表的python实现
1、无序链表的介绍列表List是一种数据项按照相对位置存放的数据集,作为一种简单强大的数据集结构,提供了丰富的操作接口,但并不是所有的编程语言都提供了List数据类型,有时候需要我们自己实现。为了实现无序表数据结构,可以采用链接表的方案。2、无序链表的性质虽然列表数据结构要求保持数据项的前后相对位置,但这种前后位置的保持,并不要求数据项依次存放在连续的存储空间。数据项存放位置并没有规则,但如果在数据项之间建立链接指向,就可以保持其前后相对位置。第一个和最后一个数据项需要显式标记出来,一个是队首,一原创 2020-08-31 00:11:51 · 360 阅读 · 0 评论 -
【数据结构与算法python】双端队列的python实现
1、双端队列的介绍抽象数据类型Queue是一个有次序的数据集合,数据从“队尾”入队,从“队首”出队。2、双端队列的性质数据项仅添加到“尾rear”端,而且仅从“首front”端移除,满足“先进先出FIFO”的性质。3、队列的基本操作class Queue: # 创建一个空队列对象 def __init__(self): self.items = [] # 测试是否空队列 def isEmpty(self): return self.items原创 2020-08-31 00:11:29 · 206 阅读 · 0 评论 -
【数据结构与算法python】队列的python实现
1、队列的介绍抽象数据类型Queue是一个有次序的数据集合,数据从“队尾”入队,从“队首”出队。2、队列的性质数据项仅添加到“尾rear”端,而且仅从“首front”端移除,满足“先进先出FIFO”的性质。3、队列的基本操作class Queue: # 创建一个空队列对象 def __init__(self): self.items = [] # 测试是否空队列 def isEmpty(self): return self.items == [原创 2020-08-31 00:10:59 · 140 阅读 · 0 评论 -
【数据结构与算法python】栈的python实现
1、栈的介绍栈是一种有次序的数据项集合,在栈中,数据项的加入和移除都仅发生在同一端,这一端叫栈“顶top”,另一端叫栈“底base”。2、栈的性质距离栈底越近的数据项,留在栈中的时间就越长,最新加入栈的数据项会被最先移除,满足“后进先出LIFO”的性质。3、栈的基本操作class Stack: # 创建一个空栈,不包含任何数据项 def __init__(self): self.items = [] # 返回栈是否为空栈 def isEmpty(self):原创 2020-08-31 00:10:38 · 215 阅读 · 0 评论 -
【数据结构与算法python】python 不同数据结构操作的时间复杂度分析
1、列表List2、字典3、集合原创 2020-08-31 00:12:40 · 189 阅读 · 0 评论