![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Algorithm
文章平均质量分 93
something about algorithm
NickHan_cs
这个作者很懒,什么都没留下…
展开
-
算法复习——图算法篇之最小生成树之Kruskal算法
算法复习——图算法篇之最小生成树之Kruskal算法以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题回顾 问题背景、问题定义和通用框架可见算法复习——图算法篇之最小生成树之Prim算法。2. Kruskal算法Prim算法和Kruskal算法最大的不同是,Prim算法始终维持边集A AA一棵树,规避了无环图的判断,且整个过程中只有两个割集,每次都要去寻找这两个割集的轻边,并加入图中;而Kruskal算法中,每一步中可能有多个割集,按顺序加入边原创 2021-01-26 00:48:07 · 428 阅读 · 0 评论 -
算法复习——图算法篇之最小生成树之Prim算法
算法复习——图算法篇之最小生成树之Prim算法以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 道路修建:需要修建道路连通城市,各道路花费不同,如下图所示。 上图中给出了一些道路修建方案,现要求连通各城市的最小花费。 这个问题本质上就是求解权重最小的连通生成子图。子图和生成子图的概念可参考算法复习——图算法篇之图的基本概念。更进一步,可以给出生成树的定义,即图T′=<V′,E>T'=<V', E>T′=&l原创 2021-01-26 00:46:00 · 429 阅读 · 0 评论 -
算法复习——图算法篇之拓扑排序
算法复习——图算法篇之拓扑排序以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 举一个生活中的实例,穿衣服是有顺序,比如肯定是先穿袜子,再穿鞋,不可能是先穿鞋,再穿袜子。 如上图所示,对于这类问题,我们可以用有向无环图里来表示事件发生的先后顺序,其中,有向规定了先后顺序,无环则避免了相互依赖。那么,问题就是比如在穿衣的这个生活场景中,如何确定一个可行的穿衣顺序呢? 我们可以给出以下的方案: 它要求有向图任意边的起点排在终点原创 2021-01-26 00:44:21 · 324 阅读 · 0 评论 -
算法复习——图算法篇之图的基本概念
算法复习——图算法篇之图的基本概念以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 图的概念1.1 图的定义图可以表示为一个二元组G=<V,E>G = <V, E>G=<V,E>,其中VVV表示非空顶点集,其元素称为顶点(Vertex)EEE表示边集,其元素称为边(Edge)e=(u,v)e = (u, v)e=(u,v)表示一条边,其中u∈Vu \in Vu∈V, v∈Vv \in Vv∈V, e∈Ee原创 2021-01-26 00:43:10 · 265 阅读 · 0 评论 -
算法复习——贪心策略篇之活动选择问题
算法复习——贪心策略篇之活动选择问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 假设有一个会场,可以举行公司年会、婚礼宴请、生日聚会和学术研讨等活动,但是不同活动举办的时间不同,为了提高会场的利用率,我们希望会场进行多种不同的活动,活动数越多,会场的利用率越高。如果把活动的时间跨度用图表现出来,即如下图所示。 由于选择出租的活动时间不能冲突,因此我们的问题就是怎样选择才能选更多的活动?2. 问题定义活动选择问题(Activit原创 2021-01-26 00:41:33 · 3209 阅读 · 1 评论 -
算法复习——贪心策略篇之霍夫曼编码
算法复习——贪心策略篇之霍夫曼编码以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 在计算机中,常用二进制串对不同字符进行编码,通常我们会使用编码树进行字符编码。对于编码树,顶点到左结点的边标记为0,到右结点的边标记1,通过编码方案构造编码树;每条根到叶子的路径对应每个字符的二进制串;叶子结点的深度就是对应的字符编码的二进制串长度一种编码方案构造出的编码树如图所示: 现给出另一种编码方式,如下表所示。原创 2021-01-26 00:40:31 · 899 阅读 · 0 评论 -
算法复习——贪心策略篇之部分背包问题
算法复习——贪心策略篇之部分背包问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景调制饮品比赛 参赛者拥有容量为800ml的杯子,可任选不超过体积上限的饮料进行混合,调制饮品价格为各所使用饮料的价格之和,所得饮品价格之和最高者获胜。问:如何使调制的饮品价格最高?饮料价格(元)体积(ml)苏打水60600汽水10250橙汁36200苹果汁16100西瓜汁453002.原创 2021-01-26 00:39:19 · 2655 阅读 · 3 评论 -
算法复习——图算法篇之单源最短路径之Bellman-Ford算法
算法复习——图算法篇之单源最短路径之Bellman-Ford算法以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 在计算带权图中源点到所有其他顶点的最短路径时,如果图中存在负权边,Dijkstra算法不再适用。 那么图中存在负权边时,是否存在单源最短路径? 如果源点sss可达负环,则难以定义最短路径。因为可以绕负环,不断松弛到−∞-∞−∞。 若源点sss无可达负环,则存在源点sss的单源最短路径。2. 问题定义单源最短路径原创 2021-01-26 00:37:05 · 265 阅读 · 0 评论 -
算法复习——图算法篇之单源最短路径之Dijkstra算法
算法复习——图算法篇之单源最短路径之Dijkstra算法以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 如何计算带权图中源点到所有其他顶点的最短路径?2. 问题定义单源最短路径问题(边权为正)(Single Source Shortest Paths Problem with Positive Weights)输入:带权图G=<V,E,W>G=<V, E, W>G=<V,E,W>,其中w(u,v)原创 2021-01-25 20:11:37 · 314 阅读 · 0 评论 -
算法复习——图算法篇之强连通分量
算法复习——图算法篇之强连通分量以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景社交圈划分如何把人群按通话记录划分成不同的社交圈?如果闭环通话,说明关系相对密切;如果单向通话,说明关系相对疏远。强连通分量(有向图)一个强连通分量是顶点的子集强连通分量中任意两点相互可达满足最大型:加入新顶点,不保证相互可达特性:任意两强连通分量不相交反证易得,若相交,破坏了最大性2. 问题定义强连通分量(Stro原创 2021-01-25 20:06:17 · 1070 阅读 · 0 评论 -
算法复习——图算法篇之图中环路的存在性判断
算法复习——图算法篇之图中环路的存在性判断以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题定义有向图中环路的存在性判断输入:有向图G=<V,E>G=<V,E>G=<V,E>,VVV是顶点集合,EEE是边的集合输出:图GGG是否存在环2. 猜想证明 根据有向图中深度优先搜索边的性质,并研究实例,我们可以猜想有向图存在环路等价于搜索时出现后向边。证明:充分性:不妨设环路上被搜索的第一个点原创 2021-01-25 19:00:50 · 674 阅读 · 0 评论 -
算法复习——图算法篇之深度优先搜索
算法复习——图算法篇之深度优先搜索以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题回顾图的搜索数组结构查询最大值:简单循环搜索所有元素,记录最大值图结构查询相邻顶点:简单循环搜索各顶点关联的边查询可达顶点:简单循环搜索,不能找到全部可达顶点! 因此,我们需要按照特定的次序搜索顶点,于是引出了两种搜索策略:广度优先搜索和深度优先搜索。广度优先搜索可参考算法复习——图算法篇之广度优先搜索。2. 算法思想走迷宫问题算法步原创 2021-01-25 18:01:14 · 714 阅读 · 0 评论 -
算法复习——图算法篇之广度优先搜索
算法复习——图算法篇之广度优先搜索以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景图的搜索数组结构查询最大值:简单循环搜索所有元素,记录最大值图结构查询相邻顶点:简单循环搜索各顶点关联的边查询可达顶点:简单循环搜索,不能找到全部可达顶点! 因此,我们需要按照特定的次序搜索顶点,于是引出了两种搜索策略:广度优先搜索和深度优先搜索。深度优先搜索可参考算法复习——图算法篇之深度优先搜索。2. 算法思想队列先来先服原创 2021-01-25 17:57:44 · 292 阅读 · 0 评论 -
算法复习——动态规划篇之钢条切割问题
算法复习——动态规划篇之钢条切割问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景钢铁切割: 现有一段长度为10的钢条,可以零成本将其切割为多段长度更小钢条。 比如有以下几种切割方案: 问题是怎么合理切割,使总收益最大?2. 问题定义钢条切割问题(Rod Cutting Problem)输入:钢条长度nnn价格表p[l](1≤l≤n)p[l](1 \leq l \leq n)p[l](1≤l≤n):表示长度为ll原创 2021-01-25 15:47:25 · 2660 阅读 · 0 评论 -
算法复习——动态规划篇之编辑距离问题
算法复习——动态规划篇之编辑距离问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景 在输入法自动更正时,像kittchen、kithen和kitchem等会被自动更正为kitchen,而不会被更正为sitting等其他单词。那么,问题就是如何衡量序列的相似程度? 我们可以用编辑操作来度量两个序列的相似程度。一个字符串A可以通过一系列编辑操作转变成另一个字符串B,假设我们只允许三种编辑操作:删除、插入和替换。如下图所示,kittchen、原创 2021-01-25 15:40:42 · 753 阅读 · 0 评论 -
算法复习——动态规划篇之最长公共子串问题
算法复习——动态规划篇之最长公共子串问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景子串:给定序列中零个或多个连续的元素(如字符)组成的子序列公共子串:给定两个序列XXX和YYY公共子串示例 问题是如何求两个给定序列的最长公共子串?2. 问题定义最长公共子串问题(Longest Common Substring Problem)输入:序列X=<x1,x2,…,xn>X=<x_1, x_2,原创 2021-01-25 15:30:10 · 764 阅读 · 0 评论 -
算法复习——动态规划篇之最长公共子序列问题
算法复习——动态规划篇之最长公共子序列问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景子序列:将给定序列中零个或多个元素(如字符)去掉后所得结果公共子序列:给定两个序列XXX和YYY公共子序列示例 问题是如何求两个给定序列的最长公共子序列?2. 问题定义最长公共子序列问题(Longest Common Subsequence Problem)输入:序列X=<x1,x2,…,xn>X=<x_原创 2021-01-25 15:24:11 · 1112 阅读 · 0 评论 -
算法复习——动态规划篇之最大子数组问题
算法复习——动态规划篇之最大子数组问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景子数组:数组中连续的一段序列,例如X[3..7]X[3..7]X[3..7];子数组和:子数组中元素的求和,X[3..7]X[3..7]X[3..7]的和就是3+5−4+3+2=93+5-4+3+2=93+5−4+3+2=9; 那么,问题就是如何寻找数组XXX中最大的非空子数组?2. 问题定义最大子数组问题(Max Continuous Subarr原创 2021-01-25 15:23:32 · 2704 阅读 · 1 评论 -
算法复习——分而治之篇之次序选择问题
算法复习——分而治之篇之次序选择问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景最小值查找:例如给定数组A[1..16]A[1..16]A[1..16],寻找其中最小值,如下图所示。依次扫描,记录最小值那么,对问题稍加改变,如何求得数组中第kkk小的元素?2. 问题定义次序选择问题(Selection Problem)输入:包含nnn个不同元素的数组A[1..n]A[1..n]A[1..n]整数k(1≤k≤n)原创 2021-01-25 15:21:32 · 1850 阅读 · 0 评论 -
算法复习——分而治之篇之快速排序
算法复习——分而治之篇之快速排序以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 从归并排序到快速排序对归并排序不了解的同学,可阅读算法复习——分而治之篇之归并排序 归并排序:简化分解,侧重合并 快速排序:侧重分解,简化合并2. 数组划分快速排序的分解2.1 基本思想任选元素xxx作为分界线,称为主元(pivot)交换重排,满足xxx左侧元素小于右侧2.2 实现方法选取固定主元xxx(如尾元素)维护原创 2021-01-25 15:20:46 · 384 阅读 · 0 评论 -
算法复习——分而治之篇之逆序对计数问题
算法复习——分而治之篇之逆序对计数问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景逆序对:当i<ji<ji<j时,A[i]>A[j]A[i]>A[j]A[i]>A[j]的二元组(A[i],A[j])(A[i], A[j])(A[i],A[j]),例如下图中的(A[1],A[4])(A[1], A[4])(A[1],A[4])、(A[2],A[4])(A[2], A[4])(A[2],A[4])等。 那原创 2021-01-25 15:19:23 · 2672 阅读 · 1 评论 -
算法复习——分而治之篇之最大子数组问题
算法复习——分而治之篇之最大子数组问题以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景子数组:数组中连续的一段序列,例如X[3..7]X[3..7]X[3..7];子数组和:子数组中元素的求和,X[3..7]X[3..7]X[3..7]的和就是3+5−4+3+2=93+5-4+3+2=93+5−4+3+2=9; 那么,问题就是如何寻找数组XXX中最大的非空子数组?2. 问题定义最大子数组问题(Max Continuous Subarr原创 2021-01-25 15:17:58 · 854 阅读 · 0 评论 -
算法复习——分而治之篇之递归式求解
算法复习——分而治之篇之递归式求解以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 递归树法T(n)={T(n4)+T(3n4)+nif n≥41if n<4T(n)=\left\{\begin{array}{rcl}T(\frac{n}{4})+T(\frac{3n}{4})+n & & {if\ n \geq 4}\\1 & & {if\ n < 4}\end{array}原创 2021-01-25 15:16:54 · 294 阅读 · 0 评论 -
算法复习——分而治之篇之归并排序
算法复习——分而治之篇之归并排序以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!1. 问题背景杠铃增重问题: 每位参赛运动员向组委会提交排好序的三次试举重量,为便于杠铃拆卸,组委会需对所有试举重量递增排序。 那么组委会该如何根据试举重量安排杠铃增重顺序?基本的解决方案:选择排序:从待排序元素中迭代选出最小值并排序,在上面的例子中,需要比较66次;插入排序:依次将每个元素插入到已排序序列之中,在上面的例子中,需要比较55次; 以上的解原创 2021-01-25 15:15:43 · 835 阅读 · 2 评论 -
渐近记号(Asymptotic Notations)
渐近记号(Asymptotic Notations)1. 定义 渐近记号是用来描述算法渐近运行时间的记号,是根据定义域为自然数集N={0, 1, 2, ……}的函数来定义的。我们通常使用渐近记号来描述算法的运算时间。接下来,会介绍一些基本的渐近记号。2. O记号(big-Oh)2.1 定义f(n) = O(g(n))——There exists constant c > 0 and n0 such that f(n) < c * g(n) for n >= n0.存在正常数原创 2020-09-07 20:03:47 · 1996 阅读 · 0 评论 -
0-1背包问题及python实现
0-1背包问题及python实现1. 问题提出 0-1背包问题是动态规划中入门的经典题型,掌握0-1背包问题背后的本质有助于更好地理解动态规划问题,话不多说,首先来看看0-1背包问题究竟是什么吧~问题描述:设有n件物品x1, x2, …, xn,每件物品有一个价值和一个重量,分别记为v1, v2, …, vn和w1, w2, …, wn,其中所有的wi均为整数。现有一个背包,其最大载重量为m,要求从这n件物品中任取若干件(这些物品要么被装入要么被留下)。问背包中装入哪些物品可是得所装物品的价值和最原创 2020-08-12 19:14:22 · 7164 阅读 · 0 评论 -
二分查找及python实现
二分查找及python实现1. 最基本的二分查找 二分查找是very very经典的算法,它最简单的题面如图所示。 对于有过一定编程基础的同学,这样的题目可以说是探囊取物。总之,二分查找是一种时间复杂度为O(log n)的查找算法,使用场景一般是有序数组及其变形的查找,这里可以给出二分查找的三个模板。模板1class Solution: def search(self, nums: List[int], target: int) -> int: left,原创 2020-08-11 11:17:26 · 574 阅读 · 0 评论 -
KMP算法及python实现
KMP算法及python实现1. 整体思路 KMP算法是一种在字符串匹配中应用十分广泛、也十分高效的算法,就是查找模式串(子串)在目标串(主串)中出现的位置,具体的问题可参考leetcode “28.实现strStr()”,题面如下图所示。 最暴力的算法就是:模式串的第0位与目标串的第0位进行比较,如果匹配,则比较模式串的第1位与目标串的第1位;如果不匹配,则将模式串整体后移1位,比较模式串的第0位与目标串的第1位。以此类推,此处便不再赘述。这种算法的时间复杂度为O(n * m),其中n、m原创 2020-07-29 14:40:10 · 680 阅读 · 0 评论