![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 60
萤火虫之暮
这个作者很懒,什么都没留下…
展开
-
哈夫曼编码的非树节点形式实现
哈夫曼编码的非树节点形式实现楔子思考过程于是想自己写一个headq构建二叉树实在太久了,完全不让看文档,不敢不相信在有限的时间里可以调试成功,于是就想了使用非树的实现方式,就是把手动画的二叉树,从树叶往上补充哈夫曼编码总结楔子今日心血来潮参加了某厂家的机试,牛客网上机试,一看只有一题且时间90分钟200分,允许使用本地IDE,就知道肯定几分钟出不来,看题目可喜的是秒懂哈夫曼编码,可悲的是一年半...原创 2020-04-18 20:50:34 · 388 阅读 · 0 评论 -
Huffman树、Huffman编码
什么是Huffman树?WPL:树的带权路径长度:如果树中每个叶子上都带有一个权值,则把树中所有叶子的带权路径长度之和称为树的带权路径长度如何构建Huffman树?算法描述:1、以权值为优先码存入优先级队列;2、反复做如下操作:取权值最小的两个元素,构造一个新的节点,权值为二者之和,且左右节点指向它们,将新节点压入优先级队列。3、直到优先级队列只剩一个节点,该节点为huffman...原创 2018-11-03 15:05:25 · 503 阅读 · 0 评论 -
图的遍历
图的遍历图的遍历是图的操作算法中最基本也是最重要的方法,与树的遍历相似,这里也分为深度优先遍历和宽度优先遍历,通过深度优先遍历得到的顶点序列称为该图的深度优先序列(Depth-First Search,DFS序列),通过宽度优先遍历得到的顶点序列称为该图的宽度优先序列(Breadth-First Search,BFS序列)Breadth-First Searchdef BFS(graph,s...原创 2018-11-06 13:37:39 · 138 阅读 · 1 评论 -
裘宗燕-数据结构与算法python描述-ppt及源代码
免费共享https://pan.baidu.com/s/1__aqzzGDNBGgPIhuErv-8w原创 2018-11-06 13:44:57 · 3731 阅读 · 2 评论 -
Dijkstra的理解和实现
Dijkstra理解:1、单点按照距离递增辐射出去;2、辐射到的点会被放进优先级队列,距离远的点可能会先放到队列里;3、距离近的,可能会后放进队列,但是肯定会先出去;4、每一个放进优先级队列的点,需要记录:自己,自己的前继节点,自己到起点的距离,会被用到的。容易的误解不是简单的每次走最近的点,是逐步(按照已确定的点不断传染辐射方式,保证最近的点一定在候选区)添加点到候选区,选出距离起点...原创 2018-11-07 12:28:23 · 192 阅读 · 0 评论 -
动态规划:斐波那契数列里面的东西?
斐波那契数列我想每个人都会写斐波那契数列吧!!斐波那契数列的定义f(0) = 1,f(1) = 1,f(n) = f(n-1) + f(n-2)基于递归的方式实现,讲到递归都会用到:def fib_sequence(n): def fib_rec(n): if n == 0 or n ==1: return n return...原创 2018-11-10 14:32:27 · 136 阅读 · 0 评论 -
Prim和Dijkstra居然写起来一模一样
一句话概括Prim和Dijkstra:Dijkstra:依次找距离起点从近到远的点;Prim:从起点开始找距离最近的点,且不形成环。这样表述还看不出来什么我们先对比二者的代码:def dijkstra2(graph,start): vnum = len(graph) pqueue = [] heapq.heappush(pqueue,(0.0,None,start...原创 2018-11-07 18:02:06 · 867 阅读 · 0 评论 -
Kruskal实现最小生成树
Kruskal实现最小生成树算法原理:一群孤立的顶点,在不形成环的情况下不断把最小的边连接起来。如何描述不形成环?1、书上的描述,把连接的顶点,标记为同一个连通分量,线段的起点ViV_iVi和VjV_jVj属于不同的连通分量即可,实现比较简单,只要一个标记数组就可以实现。代码实现:def kruskal2(graph): vnum = len(graph) pque...原创 2018-11-08 11:44:50 · 161 阅读 · 0 评论 -
01背包问题从简单到复杂
题目:有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的费用是 C i 1 ,得到的价值是 W i 。求解将哪些物品装入背包可使价值总和最大。状态转移方程:F [i, v] = max {F [i − 1, v], F [i − 1, v − C i ] + W i }基于递归的实现:def pack_0_1_Rec(N,V,C,W): if N == 0 or ...原创 2018-11-15 17:13:36 · 284 阅读 · 0 评论 -
动态规划,从例子到理解
如何设计动态规划?1、问题建模:得到优化的目标函数,约束条件?2、划分子问题:明确问题的规模在哪里?哪些维度的规模,这样才能才会划分子问题,注意边界。3、得到递推方程:可以宏观的考虑,也可以借助于微观的归纳演绎。4、然后检测是否满足最优子结构:检查子问题对其子问题的始、终点也是最优的序列。5、最小问题的界定,确定初值。如何编码动态规划?一般得到了递推方程,就可以写出基于递归的代码实...原创 2018-11-12 16:27:52 · 353 阅读 · 0 评论 -
floyd算法和动态规划
楔子long long ago就已经知道了Floyd算法,关键代码就4行,也容易记住,上上周又看到了Floyd,都说是动态规划,所以特意去学了一圈动态规划,今天终于又回到了它状态方程:d[k][i][j]定义:“只能使用第1号到第k号点作为中间媒介时,点i到点j之间的最短路径长度。”在动态规划算法中,处于首要位置、且也是核心理念之一的就是状态的定义这个大家喜欢把它叫做“松弛操作”,也就是...原创 2018-11-20 16:52:15 · 1076 阅读 · 0 评论 -
完全背包问题从简单到复杂
题目有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。放入第 i 种物品的费用是 C i ,价值是 W i 。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。第一种思路,基于投资问题模型从每种物品的角度考虑,与它相关的策略已并非取或不取两种,而是有取 0 件、取 1 件、取 2 件…直至取 ⌊V /C i ⌋ 件等许多种。状态方程为:F...原创 2018-11-16 12:25:52 · 532 阅读 · 0 评论 -
Bellman-Ford 算法 和 动态规划
Floyd算法:状态:d[k][i][j]定义:“只能使用第1号到第k号点作为中间媒介时,点i到点j之间的最短路径长度。”动态转移方程:d[k][i][j] = min(d[k-1][i][j], d[k-1][i][k]+d[k-1][k][j])(k,i,j∈[1,n])Bellman-Ford 算法:状态:d[k][u]定义:从源点v出发最多经过不构成负权值回路的k条边到达终点...原创 2018-11-21 14:06:22 · 2096 阅读 · 0 评论 -
Dijkstra和动态规划
有人说Dijkstra也是动态规划。它不是贪心吗?怎么变成动态规划了,是动态规划的话,那么就有状态,有状态方程。将图中的顶点分成2个部分,已知最短路径的顶点集合U,不知最短路径的集合V-U问题规模:就是U里面顶点个数状态:已知最短路径长度:状态方程如下:如果v 在 U中:cdis[v] = dis[v]如果v和U中某点u直连:cdis[v] =min(dis(u) + w(u,v))...原创 2018-11-21 16:38:12 · 5413 阅读 · 0 评论 -
回溯法解决01背包问题
回溯法问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。只要是解可以描述成向量方式的,就可以使用回溯法,不断的扩张部分向量,向下深入的过程就是,从部分解到可行解的过程。解必须满足多米诺性质:可行解满足约束–>部分解满足约束逆否为:部分解不满足约束–>可行解不满足约束这样可以用来pruning。最简单的回溯,解空间为二叉树,又叫子集树递归方式实现的框架如下:v...原创 2018-11-22 17:09:33 · 4581 阅读 · 0 评论 -
多重背包从简单到复杂
题目有 N 种物品和一个容量为 V 的背包。第 i 种物品最多有 M i 件可用,每件耗费的空间是 C i ,价值是 W i 。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。状态转移方程:F [i , v] = max {F [i − 1, v − k ∗ C i ] + k ∗ W i | 0 ≤ k ≤ M i }复杂度是 O(V ΣM i ) 。...原创 2018-11-17 12:40:45 · 167 阅读 · 0 评论 -
混合背包问题,和多重背包问题一样的处理
问题如果将三种背包问题混合起来。也就是说,有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。应该怎么求解呢?转化为01背包问题,对的就是和多重背包一模一样,min(V // C[i],M[i])包含了3中情况:def change_multiple_to_01(N,V,C,W,M): C_ =[] W_ =[] ...原创 2018-11-17 12:51:00 · 149 阅读 · 0 评论 -
背包问题追踪解
混合背包问题通用处理如下,我们以通用状态方式处理解空间的追踪:def pack_01_and_complete_and_multiple_Bottom_up(N,V,C,W,M): list = np.zeros((N+1,V+1),dtype=int) for i in range(1,N+1): for j in range(0,V+1): ...原创 2018-11-17 15:39:45 · 1152 阅读 · 0 评论 -
背包问题求第K优解
以01背包为例:首先看01背包求最优解的状态转移方程: F [i, v] = max {F [i − 1, v], F [i −1, v − C i ] + W i } 。如果要求第 K 优解,那么状态 F [i, v] 就应该是一个大小为 K 的队列 F [i, v, 1 . . . K] 。其中 F [i, v, k] 表示前 i 个物品中,背包大小为 v 时,第 k 优解的值。这里也可以...原创 2018-11-17 17:28:12 · 674 阅读 · 2 评论 -
最长公共子序列和追踪解
题目:LCS for input Sequences “ABCDGH” and “AEDFHR” is “ADH” of length 3.LCS for input Sequences “AGGTAB” and “GXTXAYB” is “GTAB” of length 4.实现起来比较简单,状态方程:LCS F[i,v] = (max{F[i-1,v],F[i,v-1]},F[i-1,...原创 2018-11-18 14:52:43 · 298 阅读 · 0 评论 -
01背包问题:回溯法和限界分支、递归和迭代方式
01背包问题递归方式模板:void backtrack(int t){ if(t > n) output(x); else{ for(int i = f(n,t); i <= g(n,t);i++){ x[t] = h(i); if(constraint(t) && bound(t...原创 2018-11-25 16:19:36 · 2455 阅读 · 1 评论 -
限界分支法:01背包问题,优先级队列(包含解的追踪)
前面提到:不知道大家注意到没有?上述实现方式没有使用单位体积价值的排序,和之前提到01背包回溯法基于单位体积价值实现不一样(先装单位体积价值高的)。我们网上经常看到都是基于以上实现的,到底这个用有什么好处了?实际上基于排序的单位体积价值是一个非常精确的限界函数基于优先级队列的实现方式,就需要用到以上的结构:优先级队列方式需要数据预处理,为什么需要预处理数据了,这里使用的是优先级队列,这个优...原创 2018-12-02 17:03:04 · 1835 阅读 · 0 评论 -
回溯法:批量作业调度
问题描述给定 n 个作业的集合 j = {j1, j2, …, jn}。每一个作业 j[i] 都有两项任务分别在两台机器上完成。每一个作业必须先由机器1 处理,然后由机器2处理。作业 j[i] 需要机器 j 的处理时间为 t[j][i] ,其中i = 1, 2, …, n, j = 1, 2。对于一个确定的作业调度,设F[j][i]是作业 i 在机器 j 上的完成处理的时间。所有作业在机器2上完...原创 2018-11-27 16:53:02 · 1579 阅读 · 0 评论 -
分支限界法:单源最短路径--dijkstra算法
单源最短路径–dijkstra算法前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解;分支限界法分支限界法,实际上就是回溯法,一般意义的回溯法是基于深度优先搜索,也可以配合限界函数剪枝,通常分支限界法基于宽度优先搜索,通过队列或者优先级队列实现。剪枝的策略:不相邻的边剪掉,二是结点控制关系的路径剪掉,两条路径到达同一个顶点,在解空间树上是属于两条...原创 2018-11-30 16:12:13 · 5700 阅读 · 0 评论 -
限界分支法(实际上没有剪枝,介绍的是广度优先搜索):01背包问题,队列实现方式(FIFO)
限界分支法:队列实现方式前面已经介绍过限界分支法大部分是基于广度优先搜索,广度优先搜索一般借助于队列实现,剪枝的情况可以借助于优先级队列。实现如下:#%%class FIFO_01_Pack: def __init__(self,N,V,C,W): self.num =N self.Volume = V self.Cost = C ...原创 2018-12-01 12:43:30 · 1070 阅读 · 0 评论 -
回溯法:N皇后
N皇后:N皇后是排列树,也是n叉树,排列数要求:n后不在对角线上;n叉树:n后不在对角线上且不在同一列上。约束条件:n后不在对角线上且不在同一列上。通过画图,可以轻易得到:对角线,行差距==列差距: def place(self,k): for i in range(k): if abs(k-i) == abs(self.solution[k...原创 2018-11-28 16:39:04 · 212 阅读 · 0 评论 -
回溯法:全排列
全排列递归实现:把元素换到数组首位,剩下的部分做全排列def constraint(): return Truedef bound(): return Truedef perm_backtracking(depth,lst): size = len(lst) if depth == size: print(lst) el...原创 2018-11-28 17:13:13 · 1316 阅读 · 0 评论 -
回溯法(深度优先)剪枝和分支限界法(宽度优先)剪枝对比:01背包问题
限界函数:CurValue + rest <= BestValue回溯法(深度优先)剪枝# 递归方式class pack_01_back_prune_test: def __init__(self,N,V,C,W): self.num =N self.V = V self.C = C self.W...原创 2018-12-01 16:52:31 · 3671 阅读 · 0 评论 -
限界分支法(队列方式)追踪解:01背包问题
追踪解追踪解,上述实现的情况下,解都在最后一层,根本不知道之前的路径是怎样的,广度优先搜索,同一个纬度,假如不加指标判断的话,根本不知道最优解是选择的哪一个,所以需要同一个纬度的每一个结点,记住他之前的路径,才能在最优解的时候之前是怎么走过来的,每一个结点用一个数组记录路径,这样实现的感觉消耗有点大啊,通常看见是采用链表方式限界分支法本质还是空间树,树的话,还是用链表实现比较容易和直观把之前...原创 2018-12-01 18:49:52 · 910 阅读 · 0 评论 -
货郎问题:回溯法和限界分支法
这个问题可以堪称一个全排列,[起点,剩下的全排列]import numpy as npclass backtracking_Traveling_saleman: # 初始化,明确起点 def __init__(self,graph,start=0): # 顶点的个数 self.vertex_num = len(graph) se...原创 2018-12-05 15:52:51 · 4348 阅读 · 0 评论 -
分治法:快速排序,3种划分方式,随机化快排,快排快,还是归并排序快?
快速排序不同于之前了解的分治,他是通过一系列操作划分得到子问题,不同之前的划分子问题很简单,划分子问题的过程也是解决问题的过程我们通常划分子问题尽量保持均衡,而快排缺无法保持均衡快排第一种划分子问题实现方式,左右填空的双指针方式def partition_1(arr,low,high): # 把基准元素取出来,留出一个空位,这里是在首位,这种留出空位的方式,比较容易理解 pi...原创 2018-12-12 16:47:10 · 738 阅读 · 0 评论 -
限界分支法优先级队列方式出口和追踪解的两种方法总结
在优先级队列分支限界法法中,何时为出接口,也就是while循环何时退出了?解空间为[0,1,2…,n-1],当depth = n-1时,就可以记录结果了,可以考虑循环体退出了(实际上能不能出,还要看他的权够不够大,不够大的话,还是要老老实实的去选择优先级高的分支),换句话来说,一旦有一个一个叶子节点弹出了,循环体就结束了然后就是最优解和最优解方案的追踪一般来说有两种方案:在每个活结点(就是...原创 2018-12-06 11:19:28 · 211 阅读 · 0 评论 -
分支限界发:Dijkstra算法
从分支限界的角度来看Dijkstra算法:Dijkstra算法是基于贪心的广度优先搜索,也可以看成分支限界法,从分支限界的角度来看,Dijkstra算法看起来就更加清晰明了代码实现:# =============================================================================# 分支限界法,dijkstra算法# 首先解空间...原创 2018-12-06 13:43:34 · 1037 阅读 · 0 评论 -
分治法:关于选择算法,找最大,找最小,同时找最大和最小,找第二大
找最大或者最小,蛮力算法为最优的算法,需要比较n-1次# 这个已经是最优的算法了,比较n-1次def findMax(arr): max_pivot = arr[0] for i in range(1,len(arr)): if arr[i] > max_pivot: max_pivot = arr[i] ...原创 2018-12-13 16:52:11 · 7241 阅读 · 0 评论 -
树形结构:二叉树,分治,合并子树,递归
我们学习树的时候,一些地方用到了递归,但是可能没意识到这里面都是分治的思想=============================================================================结合这几个例子,体会一下树形结构树本来就是一个天然的递归结构,每一个递归都对应着一个递归树就二叉树而言,每一个二叉树对应着一个左子树,一个右子树都不用我们思考怎么...原创 2018-12-19 15:34:29 · 668 阅读 · 0 评论 -
树形结构:迭代方式遍历树,宽度优先,先序遍历,中序遍历,后序遍历
迭代的方式处理树,就必须清楚你将要访问的顺序,对应的就是指针怎么走,你必须很清楚树的宽度优先搜索,他是一层一层的访问,就搞不清楚怎么划分子问题了,但是你访问的顺序你很清楚,那么就使用迭代的方式实现,你的指针应该可以按照一层一层的走怎么走?在线性结构里,我们处理的是数组,可以直接一个一个的走在树里,按照层次访问,每一层结点之间是跳跃的,那我们该怎么实现指针的连续走动?很容易的思路,把每一层...原创 2018-12-19 17:15:13 · 1552 阅读 · 0 评论 -
找中位数,找第k小,还存在问题
找第k小上次介绍了找第二大使用的方法时,使用锦标赛的方法,找到最大,在最大的手下败将里找第二大,也就是亚军在冠军的手下败将里产生,亚军只败给过冠军,这种方法比较次数时(n-1) + (logn-1),这个时间复杂度最优的方案了为O(n)那么怎么找第k大了,季军只能在冠军和亚军的手下败将里产生,第四名只能在前三名手下败将里产生。。。。这个方法也是O(n),但是需要记录每个选手的手下败将名单还有...原创 2018-12-14 17:15:57 · 170 阅读 · 0 评论 -
树形结构:递归转化为迭代,万能通用方法,分治策略基于栈的实现
前面提到树的3中遍历迭代实现的时候,讲到:还有一种思路,直接针对递归的实现方式,想办法通过栈来实现递归,得到的还是和上面一样一般的递归改成迭代的方法,你需要知道迭代指针是如何走的,还要借助数据结构才能实现,就是你需要注意那些需要先放入数据结构,哪些需要后放入下面介绍的方法是一种通用方法以先根遍历为例:def preorder(root): if not root: ...原创 2018-12-20 16:43:39 · 741 阅读 · 0 评论 -
树形结构:使用栈实现,快排,先序遍历,归并排序,后序遍历
主要还是学习使用栈模拟实现递归:# -*- coding: utf-8 -*-def partition(arr,low,high): # 这时另外一种考虑方式,而且他是不需要额外空间的,他只使用一个指针来区分小于基准和大于基准的 # pointer_less_than代表这个指针的左边全部都是小于基准的(包括自己,不包括首元素) # 然后从左往右扫描,遇到小于基准...原创 2018-12-20 17:02:44 · 710 阅读 · 0 评论 -
分治法:BFPTR算法找第k小
BFPTR算法来自于Blum、Floyd、Pratt、Rivest、Tarjan这5个人,一起发布了一篇名为 “Time bounds for selection” 的论文,有兴趣可以看一下:https://pan.baidu.com/s/1QEWjZBrjEJ7zTIrI99sFYA。下面是一种实现方式,这种有一个问题,只是找到中位数了,标号还要搜索然后此时的数组是有结构规律的,划分数组的时...原创 2018-12-15 12:37:37 · 310 阅读 · 0 评论