数据结构
johnjim0816
stay hungry, stay foolish
展开
-
拓扑排序Python实现
有向无环图拓扑排序是针对有向无环图(DAG, Directed Acyclic Graph)的,具有以下性质:如果这个图不是 DAG,那么它是没有拓扑序的;如果是 DAG,那么它至少有一个拓扑序;反之,如果它存在一个拓扑序,那么这个图必定是 DGA。拓扑排序对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓原创 2021-10-30 10:35:02 · 1879 阅读 · 0 评论 -
欧拉路径:Hierholzer算法
Hierholzer 算法是一种用于求欧拉路径的算法。欧拉路径指的是,如果在一张图中,可以从一点出发遍历所有的边,每条边只能遍历一次,那么遍历过程中的这条路径就叫做欧拉路径。如果这条路径是闭合的,那就称为欧拉回路。简单地说,就是我们玩的“一笔画”游戏。算法过程如下:选择任一顶点为起点,遍历所有相邻边。深度搜索,访问相邻顶点。将经过的边都删除。如果当前顶点没有相邻边,则将顶点入栈。栈中的顶点倒序输出,就是从起点出发的欧拉回路。实例重新安排行程:给你一份航线列表 tickets ,其中 tic原创 2021-09-17 00:02:13 · 3884 阅读 · 0 评论 -
十大排序算法代码(Python)
本博客是建立在已经掌握原理的基础上来方便快速查阅代码的,原理见十大排序算法(Python实现)。冒泡排序def bubble_sort(arr): '''冒泡排序 ''' for i in range(1, len(arr)): found = False # 定义是否发现逆序的flag for j in range(0, len(arr)-i): if arr[j] > arr[j+1]:原创 2021-08-10 13:17:48 · 222 阅读 · 0 评论 -
旅行商问题以及python实现
旅行商问题(TSP)即给定一组城市以及每对城市之间的距离,需要找到一条最短的路线,该路线只对每个城市进行一次访问并返回起点。这里注意汉密尔顿活路(Hamiltonian Cycle)和TSP之间的区别。汉密尔顿回路问题是要找出是否存在一次游览每个城市一次的路线。在TSP问题中,我们是已知存在汉密尔顿回路(因为该图是完整的),并且实际上,存在许多此类回路,TSP问题在于找到最小权重的汉密尔顿回路。例如,考虑下图中的图形。图中的TSP回路应该是1-2-4-3-1。游览费用为10 + 25 + 30 + 15原创 2020-11-20 18:02:26 · 11069 阅读 · 6 评论 -
哈希表扩容简述
哈希表什么时候扩容?影响哈希表扩容的因素有两个,本身的容量CapacityCapacityCapacity和负载因子LoadFactorLoadFactorLoadFactor,当前的哈希表大小大于Size>Threshold=Capacity∗LoadFactorSize>Threshold=Capacity*LoadFactorSize>Threshold=Capacity∗LoadFactor的时候,哈希表就需要扩容。负载因子一般为0.75,这就好比我们电脑C盘比如100G,实际上原创 2020-10-24 00:52:40 · 2774 阅读 · 0 评论 -
解决哈希冲突的办法
哈希冲突(Hash Collision)指的是对应不同的输入值产生了相同的哈希值从而引起的冲突。常用解决哈希冲突的方法有以下几种。开放定址法(Open Addressing)也叫再散列(Rehashing)方法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:pi=(H(key)+f(i))(mod原创 2020-10-23 19:31:31 · 1309 阅读 · 0 评论 -
用一笔画描述二叉树遍历
对于二叉树,包含深度遍历和广度遍历两种方式,其中深度遍历更为复杂,有前序、中序、后序三种方法。前序、中序、后序三种方法的考查顺序一致,但是得到的结果不同,因为:前序:考查到一个节点后,就输出该节点的值,并继续遍历其左右子节点,简称根左右中序:考查到一个节点后,将其暂存,遍历完左子树后,再输出该节点的值,然后遍历右子节点,即左根右。后序:考查到一个节点后,将其暂存,遍历完左右子树后,再输出该节点的值,即左右根。三种方法的代码都是类似的,如下是利用栈遍历二叉树:class Solution:原创 2020-07-11 14:34:24 · 390 阅读 · 0 评论 -
希尔排序Python实战
思想导引希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,它是基于简单插入排序的改进版本,也称为递减增量排序算法。在食用本文之前可以先简单了解一下插入排序的原理。我们都知道插入排序的时间复杂度是O(n2)O(n^2)O(n2),比如对于一个长度为8的序列,它的时间复杂度对于插入排序来说就是O(82=64)O(8^2=64)O(82=64)。但是需要注意的是实际上...原创 2020-04-20 10:52:23 · 433 阅读 · 0 评论 -
最短路:Floyd算法(Python实现)
Floyd-Warshall算法是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权(但不可存在负权回路)的最短路径问题。Floyd算法原理是动态规划。算法描述开始:对于每一对顶点v和v’,从v到v’图中不经过任何其他顶点,如果v到v’存在边,那么长度就是该边的权,如果没边就设长度为无穷大k=0k=0k=0:即对于每一对顶点v和v’,途径顶点的下标不大于kkk,实际上这里只能经过v0v_0v0,该路径可分为两段,即<v,v0><v,v_0><v,v0>原创 2020-10-19 11:16:37 · 7554 阅读 · 1 评论 -
最短路:Dijkstra算法(Python实现)
戴克斯特拉算法是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年发现的算法,并于3年后在期刊上发表。戴克斯特拉算法使用类似广度优先搜索的方法解决赋权图的单源最短路径问题(即确定起点,求到剩下所有的最短路)。算法描述输入:给定正向带权图G=<E,V>G=<E,V>G=<E,V>初始:集合U中放入起始点v0,v0到自身的距离为0,可记为(0,v0,v0)在U中取出路径最短的顶点(plen,v0,vmin),此时plen就是V0到vmin的最短距离,可记为paths原创 2020-10-19 11:04:01 · 5433 阅读 · 9 评论 -
贪心算法简述
基本概念贪心算法又叫贪婪算法,是一种在每一步选择中都采取在当前状态下最好或最优(法,即最有利)的选择,从而希望导致结果是最好或最优的算法基本思路1.建立数学模型来描述问题。2.把求解的问题分成若干个子问题。3.对每一子问题求解,得到子问题的局部最优解。4.把子问题的解局部最优解合成原来解问题的一个解。适用问题实际上贪心算法适用的问题很少。一般,对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可做出判断。贪心算法可以解决一些最优化问题比如求最小生成树、哈夫曼编码原创 2020-10-19 01:23:25 · 943 阅读 · 1 评论 -
十大排序算法(Python实现)
算法复杂度排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性冒泡排序O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)O(n)O(n)O(n)O(1)O(1)O(1)稳定插入排序O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)O(n)O(n)O(n)O(1)O(1)O(1)稳定选择排序O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)O原创 2020-10-17 16:43:44 · 603 阅读 · 2 评论 -
Kruskal算法(Python实现)
Kruskal算法是一种用来查找最小生成树的算法,由Joseph Kruskal在1956年发表。用来解决同样问题的还有Prim算法和Boruvka算法等。三种算法都是贪心算法的应用。和Boruvka算法不同的地方是,Kruskal算法在图中存在相同权值的边时也有效。算法描述新建图G,G中拥有原图中相同的节点,但没有边将原图中所有的边按权值从小到大排序从权值最小的边开始,如果这条边连接的两个节点于图G中不在同一个连通分量中,则添加这条边到图G中重复3,直至图G中所有的节点都在同一个连通分量中原创 2020-10-16 01:21:47 · 7872 阅读 · 7 评论 -
Prim算法(Python实现)
Prim算法是图论中的一种算法,可在加权连通图里搜索最小生成树。算法描述输入:一个加权连通图,顶点集合为V,边集合为E初始化:Vnew={x},其中x是V中任一节点,作为起始点,Enew={}在E中选择权重最小的边(u,v),其中u为集合Vnew中的元素,而v则是V中没有加入Vnew的顶点(如果权重相同就任选一个)将v加入集合Vnew中,将(u,v)加入集合Enew中重复步骤3-4,知道Vnew=V输出:使用Enew和Vnew描述得到的最小生成树对于使用堆和邻接表表示最小权边和图的情况,原创 2020-10-16 01:17:01 · 6368 阅读 · 2 评论