
数据结构与算法
谁动了我的吐司
live the way you like
展开
-
【算法概论】网络流:带需求和下界的流通问题
待补原创 2019-06-18 10:30:24 · 491 阅读 · 0 评论 -
【算法概论】图论算法:Bellman-Ford算法
带负权值边的有向图中的最短路径路径问题问题描述: 对于一个带负权值边的有向图,实现Bellman-Ford算法, 求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环。❗算法描述❗: https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html http...转载 2019-05-19 20:01:06 · 340 阅读 · 0 评论 -
【算法概论】图论算法:无向图中的双连通分量划分问题
问题描述: 给定一个无向图,设计一个算法,判断该图中是否存在关节点,并划分双连通分量。❗算法描述❗: 先明确几个概念: Let G be a connected graph: A separation vertex (articulation) 关节点of G is a vertex whose removal disconne...原创 2019-05-19 14:31:51 · 1054 阅读 · 0 评论 -
【算法概论】贪心算法:反馈边集总权重最小
问题描述: 无向图 G = (V, E) 的反馈边集 E' 是边集 E 的一个子集,该子集与图中所有的环相交。因此,移除 E' 中的边将使得 G 无环。 请对如下问题给出一个高效的算法。 输入:具有正边权重 we 的无向图 G = (V, E)。 输出:一个反馈边集 E‘E,使其权重和最小。❗算法描述❗: 题目...原创 2019-04-24 21:02:36 · 1397 阅读 · 0 评论 -
【算法概论】贪心算法:Horn公式
Horn公式,又称霍恩公式。Horn公式中最基本的对象是取值为true或false的布尔变量。在Horn公式中,关于变量的知识通过两类子句表达:① 蕴含式:其左侧为任意肯定变量的并,右侧为一个单独的肯定变量。如:(z /\ w) → u。② 纯否定子句:包含任意多个否定文字的或。如:()。问题描述:给定某个由以上两类子句构成的集合,我们需要判断是否存在一个一致的解释,也即...原创 2019-05-04 20:28:11 · 5254 阅读 · 0 评论 -
【算法概论】Huffman树
1、哈夫曼树,又叫最优二叉树:效率最高的判决数。2、回忆树的相关知识① 路径长度:路径上的结点数 - 1。② 结点的权:在许多应用中,常常给树的结点赋予一个有意义的数,称为该结点的权。③ 结点的带权路径长度:该结点到树根的路径长度 × 该结点的权。④ 树的带权路径长度:树上所有叶子结点的带权路径长度之和,通常记作 WPL 。3、哈夫曼树定义 在权为w1, w...转载 2019-05-04 19:29:32 · 375 阅读 · 0 评论 -
【算法概论】贪心算法
本文参考:《算法的乐趣》,老师上课ppt贪心算法,又称贪婪法Greedy algorithm一般将求解过程分为若干个步骤,在每个步骤都应用贪心原则,选择当前状态下最好或最优的解。贪心算法与其他算法最大的不同:贪婪法每一步选择结束后,局部最优解就确定了,不再进行回溯处理。也就是说,每一个步骤的局部最优解确定后,就不再进行修改,直到算法结束。the difference betw...转载 2019-04-23 21:22:01 · 449 阅读 · 0 评论 -
【算法概论】贪心算法:区间调动问题
区间调动问题 Interval Scheling题目描述: Job j starts at sj and finishes at fj . Two jobs compatible if the intervals [si,fi) and [sj,fj) do not overlap. Goal:find maximum subset of mutua...原创 2019-04-23 21:03:17 · 546 阅读 · 0 评论 -
【算法概论】贪心算法:最小延迟调度问题
最小延迟调度问题 Scheduling to Mnimizing Lateness问题描述: 假定有一单个的资源在一个时刻只能处理一个任务。现给定一组任务,其中的每个任务 i 包含一个持续时间 ti 和截止时间 di 。设计与实现一个算法,从t = 0 时刻开始任务,对这组任务给出一个最优调度方案,使其对所有任务的最大延迟最小化。 Single resource...原创 2019-05-02 10:55:47 · 8609 阅读 · 0 评论 -
【算法概论】图论算法:有向图中环的判断问题
问题描述: 给定一个有向图,要求使用深度优先搜索策略,判断图中是否存在环。❗算法分析❗: 判断图中是否存在环,要涉及到图的拓扑排序。回看数据结构的书原创 2019-05-11 16:05:57 · 4163 阅读 · 0 评论 -
【算法概论】图论算法:Dijkstra算法
广度优先搜索算法 Dijkstra 算法(迪杰斯特拉算法) 广度优先搜索算法:❗算法描述❗: 以 s 为源点,将图划分为不同的层次。s 其本身作为一个层次,表示与 s 间距为 0 的顶点,还有与 s 间距为 1 的顶点、间距为 2 的顶点 …… 按层次检索下来,就得到图的广度优先搜索序列。 从上面的描述就可以看出,广度优先搜索树有这样一...原创 2019-05-21 20:40:26 · 363 阅读 · 0 评论 -
【算法概论】贪心策略:Dijkstra算法
问题描述: 迪杰斯特拉算法,用于计算一个顶点到其他结点的最短路径。❗算法描述❗: 主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 1、通过 Dijkstra 计算图 G 中的最短路径时,需要指定起点 s(即从顶点 s 开始计算)。 2、此外,引进两个集合 S 和 U 。S 的作用是记录已求出最短路径...转载 2019-06-16 20:39:13 · 2681 阅读 · 0 评论 -
【算法概论】搜索算法
搜索算法 搜索算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。(百度百科) 搜索算法需要在指数量级的繁杂的可选对象中搜索某个具有特定性质的解,而且,求解这些问题似乎没有什么捷径可行。(《算法概论》) 现阶段,搜索算法实际上是根据初始条件和扩展规则构造一棵“解答树”并寻找符合目标状态的节点的过程。...原创 2019-06-07 21:25:25 · 2997 阅读 · 1 评论 -
【算法概论】线性规划与规约:二部图匹配问题
Bipartite Matching(二部图匹配问题)问题描述: 输入:无向图,二部图 G = ( L ∪ R, E) 输出:最大基数匹配❗算法描述❗: 与之前计算最大流的算法相似,首先要将该问题转化为最大流问题。二部图匹配问题旨在输出从 L 到 R 可以有的最多的路径。我们就可以在左侧加一个源点 source,在右侧加一个终点 sink。源...原创 2019-06-02 09:54:41 · 973 阅读 · 0 评论 -
【算法概论】线性规划与规约:网络流
最大流和最小割问题描述: 网络流:一个连通的赋权有向图 G = (V、E、C),其中 V 是该图的顶点集,E 是有向边(即弧)集,C 是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,它有两个性质:① 每条边的流量不超过它的容量;② 除 s 和 t 的任意结点,流入 u 的流量等于流出 u 的流量。 最大流问题:找到从 s...转载 2019-05-23 20:38:05 · 1374 阅读 · 0 评论 -
【算法概论】图论算法:Bellman-Ford算法
问题描述: 带负权值边的有向图中的最短路径路径问题:对于一个带负权值边的有向图,实现 Bellman - Ford 算法,求出从指定顶点 s 到其余顶点的最短路径,并判断图中是否存在负环。❗算法分析❗: Dijkstra 算法之所以能够运行,是因为从起始点 s 到任一顶点 v 的最短路径一定会经过比 v 距离 s 更近的点。但当边值可以为负时,这条原则不再成立。...原创 2019-05-22 19:55:15 · 293 阅读 · 0 评论 -
【算法概论】图论算法:题4.18
❗ 算法描述❗: 在更新 dist 值的时候,也判断 best 的关系,并进行更新。/* * * * * *Accordingly, for a specific starting node s,define best[u] = minimum number of edges in a shortest path from s to u.Give an effici...原创 2019-05-26 14:35:03 · 225 阅读 · 0 评论 -
DFS非递归形式
判断从 source 到 target 有无路径,使用DFS的非递归形式,用到栈!bool DFS(int s){ path.push(s); while (!path.empty()) { int p = path.top(); visited[p] = true; if (s == target) { return true; } path.po...原创 2019-05-25 20:24:05 · 937 阅读 · 1 评论 -
【算法概论】图论算法:二部图的判断
二分图相关知识指南将原贴中判断二分图的代码按自己的习惯改了一下:#include <iostream>#include <vector>#include <algorithm>#include <stdio.h>using namespace std;int vexnum, edgenum;bool dfs(vect...转载 2019-05-12 20:17:30 · 1181 阅读 · 0 评论 -
【算法概论】图论算法:将图分解为强连通部件
问题描述: 给定一个有向图,设计一个算法,求解并输出该图的各个强连通分量。❗明确概念❗: 连通性:在无向图中,若从顶点 u 到 v 有路径,则称顶点 u 与 v 是连通的。 强连通图:在有向图中,若对于每一对顶点 u 和 v,都存在一条从 u 到 v 的路径,则称此图是强连通图。 强连通分量 Strongly Connected...原创 2019-05-12 16:39:04 · 1506 阅读 · 0 评论 -
【算法概论】贪心算法:区间划分问题
区间划分问题Interval Partitioning问题描述: Lecture j starts at sj and finishes at fj Goal:find minimum number of classrooms to schedule all lectures so that no two occur at the same time in th...原创 2019-05-01 19:19:59 · 4885 阅读 · 1 评论 -
【算法概论】动态规划:字符串拆分
问题描述: 某种字符串处理语言允许程序员将一个字符串拆分为两段。由于此操作需要复制字符串,因此要花费n个时间单位来将一个n个字符的字符串拆为两段。假定一个程序员希望将一个字符串拆分为多段,拆分的顺序会影响所花费的总时间。 例如,假定这个程序员希望将一个 20 个字符的字符串在第 2 个,第 8 个以及第 10 个字符后进行拆分(字符由左至右,从1开始升序...转载 2019-04-22 19:25:50 · 1260 阅读 · 0 评论 -
【算法概论】动态规划:背包问题
0 - 1背包问题问题描述: 给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W(假定物品重量与背包容量值均为整数),应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?设计一个动态规划算法,求解背包问题。❗算法描述❗:定义 w[] 存储各物品的重量,v[] 存储各物品的价值,背包的重量为 wsum。①定义子问题: k(w...原创 2019-04-17 21:01:47 · 1855 阅读 · 0 评论 -
【算法概论】分治算法:查找数值
二分查找时间复杂度:O(logn)/*给定一个无穷数组,前n个元素都是整数且已排好顺序, n的值未知,其余元素为∞。*/#include <iostream>#include <limits.h>using namespace std;bool bSearch(int data[], int head, int tail, int x);in...原创 2019-03-16 22:18:22 · 532 阅读 · 0 评论 -
【算法概论】分治算法:数组去重
先进行归并排序,再一项项进行去重。时间复杂度:O(n*logn)#include <iostream>using namespace std;void mergeSort(int data[], int head, int tail);void merge(int data[], int head, int mid, int tail);int main(){...原创 2019-03-16 22:13:36 · 226 阅读 · 0 评论 -
【算法概论】分治算法:查找中位数
1、问题描述:对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中位数。2、算法描述:以原数组中位于中间位置k的元素作为基准值pivot,对原数组进行划分,分别为元素值< pivot、= pivot和> pivot的三部分,将这三部分的元素值分别赋给数组SL、SV、SR,并计算出SL、SV、SR中有效元素的个数sl、sv、sr。将k...原创 2019-03-20 18:12:59 · 5406 阅读 · 2 评论 -
时间复杂度中的log(n)底数到底是多少?
原文:https://blog.youkuaiyun.com/bengxu/article/details/80320546其实这里的底数对于研究程序运行效率不重要,写代码时要考虑的是数据规模n对程序运行效率的影响,常数部分则忽略,同样的,如果不同时间复杂度的倍数关系为常数,那也可以近似认为两者为同一量级的时间复杂度。现在来看看为什么底数具体为多少不重要?读者只需要掌握(依稀记得)中学数学...转载 2019-03-16 19:46:34 · 1366 阅读 · 0 评论 -
【算法概论】分治算法:计算数组中的逆序对
题目1:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,共存在5组逆序对。最直观的方法就是直接求解了,依次扫描数组中的各个数字,并将其与其后的数字作比较。还有一种方法就是,利用分治的思想:比如数组data = {7, 5, 6, 4};我们可以将data分解,一直分解到每个...原创 2019-10-11 13:42:45 · 2128 阅读 · 0 评论 -
【算法概论】分治算法:归并排序
#include <iostream>using namespace std;void mergeSort(int data[], int head, int tail); void merge(int data[], int head, int mid, int tail);int main(){ int data[4] = { 7, 5, 6, 4 }; i...原创 2019-03-14 19:14:23 · 186 阅读 · 0 评论 -
链表排序
链表定义及主函数1、list.h文件1、 #ifndef _LIST_H_ 2、 #define _LIST_H_ 3、 4、 struct ListNode 5、 { 6、 int val; 7、 ListNode* next; 8、 }; 9、 10、#endif 2、main.cpp(省去链表排序代码)1. #in...原创 2019-03-01 15:07:36 · 718 阅读 · 0 评论 -
为何程序员喜欢将INF设置为0x3f3f3f3f?
在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具体问题取一个99999999之类的数(显得很不专业啊!)在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个...转载 2018-12-31 18:34:22 · 238 阅读 · 0 评论 -
【算法概论】分治算法:求主元素
时间复杂度:O(n*logn)将数组A划分成两个数组A1和A2,各含有A中的一半元素。考虑以下的问题:如果知道了A1和A2中各自的主元素,是否会对找出A中的主元素有所帮助? → 分治法/*找数组的主元素(主元素的重复次数超过数组大小的一半)。先将数组划分成两个数组A1和A2,找它们各自的主元素。*/#include <iostream>#include <l...原创 2019-03-16 22:21:46 · 1920 阅读 · 0 评论 -
【算法概论】分治算法:k路归并
首先了解两个概念,胜者树和败者树:胜者树和败者树都是二叉排序树,是树形选择排序的一种变形。每个叶子节点相当于一位选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。胜者树的中间结点记录的是胜者的标号,败者树的中间结点记录败者的标号。因此,胜者树和败者树的根节点,就是最终的胜者或败者 —— 反映到一组数据中,可以是最大值或最小值。胜者树与败者树可以在log(n)的时间内找到最值。任...原创 2019-03-20 21:08:49 · 5668 阅读 · 2 评论 -
【算法概论】动态规划:最短路径问题
因为刚开始想着,既然在图中表示,就要用到图的存储结构等等吧,所以原创 2019-04-03 20:35:10 · 13852 阅读 · 2 评论 -
【算法概论】动态规划的主要属性及优质链接
1)重叠子问题 (Overlapping subproblems) 像分治法一样,动态规划包含了对子问题的解决。动态规划主要用于不断地解决相同子问题。在动态规划中,子问题的计算解被存储在表中,使得这些不必重新计算。因此,当没有公共(重叠)子问题时,就不会使用动态规划。例如,二分搜索没有公共子问题。如果我们以斐波纳契数字的递归程序为例,有很多子问题会被反复解决。/* simpl...原创 2019-04-09 17:18:52 · 226 阅读 · 0 评论 -
【算法概论】动态规划:最大相连子序列
《算法概论》习题6.11、定义 dp[i] 为 以S[i]作为末尾的最大连续序列的和;2、则 dp[i] 的值只会有两种情况: ① dp[i] = S[i]; ② dp[i] = dp[i-1] + S[i];3、可得状态转换方程:dp[i] = max(S[i], dp[i] + S[i])。#include <iostream>#...原创 2019-04-08 19:38:24 · 210 阅读 · 0 评论 -
【算法概论】动态规划:最长公共子序列
最长公共子序列(The longest common subsequence)问题描述: Given two sequences. X = (x1 , x2 , …, xm), Y = (y1 , y2 , …, yn), find a maximum length common subsequence (LCS) of X and Y. E.g.: ...原创 2019-04-11 20:20:44 · 231 阅读 · 0 评论 -
【数据结构】图 - 邻接表表示法
1、邻接表表示法的基本思想: 对图中的每个顶点vi都分别建立一个对应的单链表(对无向图称为“边表”,对有向图称为“出边表”)来存储所有邻接与顶点vi的边(对于有向图而言是指以vi为尾的弧),边表中的每个结点分别对应于邻接于顶点vi的一条边。边表中的每个结点主要包含两个域,其中邻接点域(adjvex)指示与顶点vi邻接的点在图中的位置,链域(nextedge)指示下一条边或弧的结点...原创 2019-04-07 19:41:57 · 9751 阅读 · 0 评论 -
【算法概论】动态规划:最长递增子序列
最长递增子序列(Longest increasing subsequences)问题描述: the input is a sequence of numbers a1, a2, ……, an. A subsequence is any subset of these numbers taken in order, of the form ai1, ai2, ……, aik wh...原创 2019-04-10 20:03:16 · 241 阅读 · 0 评论 -
【算法概论】动态规划:矩阵连乘问题
矩阵连乘问题(Matrix Multiplication Order Problem / Chain Matrix Multiplication)【文中所有标蓝字体为下标】问题描述: 有 n 个矩阵进行连乘,已知各个矩阵的行列数,问:如何在算式的中间插入合适的括弧,使得乘法的进行次数最少?问题解释: 一个 m * n 的矩阵与一个 n * p 的矩阵相乘...原创 2019-04-10 20:49:37 · 4242 阅读 · 0 评论