algorithm
青盏
这个作者很懒,什么都没留下…
展开
-
动态规划之装配线调度理解
一.装配线事例二.例题分析动态规划适用于子问题不是独立情况, 各个子问题包含公共子问题。通常用于最优化问题,我们需要找出一个最优解。上述装配线问题考虑的是当一个底盘进入装配线后该选择使用哪个装配线上的装配站从而使得时间最少(尽管我觉得两条线独立运行应该生产效率最高)。 假设装配线的转移不需要时间的话,显然我们只需要考虑下一个是1号线装配站还是2号线装配站即可,只需要选择时间最短的。比如当前底盘在S原创 2016-08-16 17:42:14 · 2870 阅读 · 1 评论 -
字符串之KMP算法
一、介绍 KMP算法全称Knuth-Morris-Pratt算法,是一种字符串匹配算法,常规字符匹配是每次移动一位,复杂度O(mn);而KMP算法复杂度O(m+n)。二、算法原理 KMP算法利用的是目标字符串(要匹配的字符串,如下图第二行)前后缀有相同的子字符串和在匹配过程中前i-1个字符已经匹配过的规律。 匹配过程: 部分匹配表: 从第一张图中我们看到当我们目标字符串第一位与被匹原创 2016-09-10 15:46:03 · 951 阅读 · 0 评论 -
动态查找之哈希(hash)表
一、介绍 与其他建立在“比较”基础上的查找算法不同,哈希表是通过哈希函数将储存位置与值得关键字建立一一对应关系,从而一般一次就能够得到值。但是有时对于不同关键字哈希后得到的地址会是相同的,称这种现象为冲突。具有相同哈希值的关键字称为同义词。二、哈希函数哈希函数一般都是尽可能是的关键字随机性较大,出现相同概率小。 直接定址法:根据关键词由哈希函数直接计算得地址 数字分析法:分析关键字规律,尽原创 2016-09-08 15:37:31 · 1934 阅读 · 0 评论 -
树之赫夫曼树 最优二叉树
一、介绍赫夫曼树可以用来优化算法,减少运行次数;还可以用于电报编码。 二、优化算法对于我们嵌套的if语句,通常我们需要判断多次if。但是if里表达式的顺序与程序运行速度有很大关系。如果我们把频率高的if条件放在前面的话就能够避免多次检测false的if语句。 算法思想: 三、赫夫曼编码 赫夫曼树结点每向下一层只有两个度,对应于0-1情况。从根结点走到叶子结点只有一条路径,而且不使原创 2016-09-05 13:02:28 · 1220 阅读 · 0 评论 -
并查集
一、算法解释用于解决一些有N个元素的集合应用问题。 1、将每个元素初始化为自身单独成为一个集合。用p[i]的值表示该元素所在集合。 2、现在我们想将3和1元素连线并成一个集合。可以将p[3] = 1。当p[3] != 3时说明该元素集合已经并入其他集合。 3、现在我们又将2与3连线并入一个集合,可以将p[2] = 3。 算法巧妙之处:一是利用集合中元素最大或最小节点编号作为集合标原创 2017-08-17 15:38:42 · 284 阅读 · 0 评论 -
图之强连通、强连通图、强连通分量 Tarjan算法
一、解释在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。 求解有向图的强连通分量算法有很多,例如Kosaraju,Gabow和Tarjan算法,其中Gabow和Tarja原创 2017-08-20 18:27:39 · 31079 阅读 · 0 评论 -
图之最小生成树 Kruskal算法 Prim算法
一.实际问题最小生成树一般应用在网(带权的图)问题中,实际问题一般比如: 假设要在n个城市间建立通信联络网,则联通n个城市只需要n-1条线路,但是每两个城市间都可以建设路线,而且城市与城市间建设代价是不同的,这就需要我们考虑一种经济的联络方式。 将问题转换成图的话,就如下图(圆圈代表城市,线代表线路,线上数值代表建设的代价),我们需要从中选择一条代价最小的建设方式。 二.基本思想 一般情原创 2016-08-28 23:40:50 · 1649 阅读 · 0 评论 -
欧拉回路 欧拉通路 欧拉回路图
来源一、定义对于无向图: 1) 设G是连通无向图,则称经过G的每条边一次并且仅一次的路径为欧拉通路; 2) 如果欧拉通路是回路(起点和终点是同一个顶点),则称此回路为欧拉回路(Euler circuit); 3) 具有欧拉回路的无向图G称为欧拉图(Euler graph)。 对于有向图: 1) 设D是有向图,D的基图连通,则称经过D的每条边一次并且仅一次的有向路径为有向欧拉通路; 2)转载 2017-08-24 16:28:21 · 1254 阅读 · 0 评论 -
按字典序算法全排列
一、简介原文按照字典里的排序方法:先比较第一个字符i 和 bb<i b是第2个 ,i是第9个 2 < 9于是 baray < ilove如果第一位相同,就比较第二位,例如:abcdd<abcdeaaaay<aaaaz如果其中之一是另一个的前缀,则短的那个排前面:aaa < aaab来自百度百科算法如下:设P是数字1~n的一个全排列:p=p1p2......pn=p1p2....原创 2017-08-14 20:31:10 · 4091 阅读 · 0 评论 -
BFS广度优先搜索 DFS深度优先搜索 回溯算法
一、BFS广度优先搜索 CCF 最优灌溉二、DFS深度优先搜索 深度搜索:CCF 送货 深度搜索:CCF 网络延时 发现回溯算法基于深度优先搜索,试探性假设某一路径能都到达目标,当遍历到树底不行时,往回退一步,然后在换另一条路径先前。 从零开始学回溯算法 经典回溯算法(八皇后问题)原创 2017-08-18 19:08:10 · 2413 阅读 · 0 评论 -
树状数组 ( Binary Indexed Tree,BIT,二分索引树 )
百度很多树状数组,唯有此篇一看就懂。 原文一、简介在有时,需要计算数组某个区间内的和,如果采用常规算法,每次求和时遍历一遍求和比较耗时间,而树状数组维护一个求和数组,将原数组的一些求和结果存在数组中,使用时直接用树状数组求和。最常用的求区间和问题,单点更新。二、建树 结构: 如上A代表原数组,而C代表树状数组。树状数组具有数组和树两个特性,在存储上以数组形式按顺序存储,在逻辑关系上,通过数组下转载 2017-11-14 20:31:55 · 1516 阅读 · 0 评论 -
动态规划之矩阵链乘法理解
一.矩阵链事例 矩阵链问题主要涉及的时在多个矩阵相乘,如何通过相乘的顺序来减少程序运行。二.例题分析这次分析过程按照动态规划的三个基本条件来逐步解答:1、寻找最优子结构:假设我们已经找到父矩阵链最优解,当我们划分到最后一步时都是两个子矩阵链(分别被括号包围)相乘,如(A1A2A3A4)(A5A6A7),此时显然外括号为父矩阵的最优括号划分。继续往下划分,((A1A2A3)A4)(A5(A6A7))原创 2016-08-16 17:37:20 · 4835 阅读 · 1 评论 -
图之单源最短路径 Bellman-Ford算法 Dijkstra算法 SPFA算法
一.实际问题 一般情况下广度优先搜索能够解出单位权值问题,只需要进行广度搜索,最先到达目的地的路径最短。但是对于非单位权值就没有办法,不同于单位权值每天边的代价相等,非单位权值每条边代价不等。这样我们就不能每次往下一次搜索时前面各条路径代价相同。如果非要采用广度搜索那只能把每条能够到达目的地的路径的总代价都计算出来,取最小值。二.一些定义 显然,如果从Vi到Vj有更短的路径,那为何不使用这条最短原创 2016-08-31 21:14:33 · 2133 阅读 · 0 评论 -
算法中小技巧
递归-存储如果递归计算过程中需要重复计算某个参数的值,则应该将其存储起来。int fib(int n){ if(n<=1) return n; return fib(n-1)+fib(n-1);}int memo[MAXN+1];int fib(int n){ if(n<=1) return n; if(memo[n]!=0) return memo[n]; /原创 2017-11-29 22:29:28 · 315 阅读 · 0 评论 -
十道海量数据处理面试题与十个方法大总结
主要步骤如下:1、首先看看能不能直接使用hashmap+排序解决,如果不行:2、对于query、url、word等字符串类型,可以使用hash取模的方式将其写入不同文件中,然后每个文件单独处理后再归并(hash分治、堆排序、归并排序:可用于统计、排序,判断存在);3、对于数值型数据,可以与步骤2同样处理,另外还可以使用位来表示每个数的存在与否(布隆过滤、bit-map:可用于判断是否存...转载 2019-02-17 10:37:40 · 577 阅读 · 0 评论 -
十大经典排序算法(动图演示)
来源0、算法概述0.1 算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2 算法复杂度0.3 相关概念稳定:如果a原...转载 2019-03-11 15:01:05 · 211 阅读 · 0 评论 -
内部排序之插入排序(InsertSort)
一、基本思想 直接插入排序(最坏时间O(n*n))是将一个数据插入到已经排序好的列表中。假设列表已经从小到大排列好,此时又有个新数据插入,可以从列表尾部开始向前遍历,与新数据比较。如果新数据比当前遍历数据小时停止遍历,将新数据插入。二、核心算法三、事例四、折半插入由于直接插入排序,新数据是插入一个已经排序好的序列。所以在查找插入位置过程中其实就是对一个排序序列进行查找。我们可以采用折半查找来实原创 2016-09-25 15:48:48 · 1467 阅读 · 1 评论 -
内部排序之快速排序(QuickSort)
一、基本思想快速排序法是对冒泡法的改进。基本思想为:从列表中任选一个记录作为枢纽。然后从列表的开始和结束位置向中间遍历,把记录的关键字与枢纽进行比较。小于枢纽的记录放在低位,大于枢纽的记录放在高位。从而把列表分成两部分,一部分大于枢纽,一部分小于枢纽。最坏时间O(n*n)二、核心算法三、递归调用四、例题LeetCode之Two Sum原创 2016-09-07 21:48:54 · 504 阅读 · 0 评论 -
静态查找静态树表
一、基本思想静态树表为的是解决查找概率不等的记录。一般情况下,我们都是默认各个记录等概率查找的,但是有些记录可能不是等概率的。我们可能会首先搜索一些概率大的记录。 二、构造过程次优查找树和最优查找树的查找性能仅差1%-2%,而构造最优查找树花费时间代价较高。现构造一棵二叉树,使得二叉树的带权内的路径长度PH值在所有具有同样权值的二叉树中近似最小,称为次优查找树。 构造原理如下: 三、事例原创 2016-09-29 13:34:13 · 6185 阅读 · 0 评论 -
贪心算法之活动选择理解
一.活动选择事例二.例题分析1、定义子问题 采用动态规划的方法: 2、寻找最优子结构: 假设已经找到问题Sij最大兼容活动集Aij,如果Aij中包含Ak(属于某一活动)。则可以将Sij分成两个子问题Sik和Ak和Skj。此时Sik和Skj的最大兼容活动集Aik和Akj一定被Aij使用。因为如果Aij没有使用Aik和Akj的话,那么它使用的就是Sik,Skj非最大兼容子集。那么就与我们假设的原创 2016-08-17 20:07:21 · 2741 阅读 · 1 评论 -
动态规划和贪心算法之背包问题理解
一.背包问题引用书上关于0-1背包和部分背包的阐述: 二.贪心与动态规划区别关于红色矩形部分解释为什么0-1不能使用贪心算法,是因为当你选择一个物品时,整个物品的大小都需要计算,然而背包的的大小又是固定的,那么剩下的背包大小与剩下的物品之间就有个容纳问题。就像图b第二个树状图属于容量20,而剩余物品大小30,显然放不下,所以说选择放与不放会影响后放物体能否尽可能填满背包。这个与部分背包问题不同原创 2016-08-17 21:55:05 · 19347 阅读 · 2 评论 -
图之有向无环图,拓扑排序,关键路径
一.实际问题 上图可看出有向无环图(DAG)与一般图区别:有方向,共用子结构,无环。 有向无环图常用于解决工程活动问题: 判断工程是否能否顺利进行–拓扑排序 求工程完成所必须的最短时间–关键路径二.拓扑排序 拓扑排序主要为后续求最短路径做准备,同时判断图是否有环。 从偏序得到拓扑有序的操作称为拓扑排序。 在偏序中,有些成员无法比较,而全序中所有成员都可比较。如上原创 2016-09-01 20:37:08 · 3852 阅读 · 0 评论 -
图之每对顶点最短路径
一、算法每对顶点最短路径解决比如每对城市间的距离。 二、基于矩阵的动态规划算法 以上分析了满足动态规划条件。 在寻找子结构时是从后向前分析。首先定义父问题的最短路径,然后在减去最后一个顶点变成子问题的最短路径。在从后向前分析是我们的子问题路径总是在那条最优路径上减去最后一个顶点。然后在我们从前往后进行算法时我们考虑的却是所有子问题。 比如说我们假设上图上面一条路径为最原创 2016-09-03 00:01:00 · 1021 阅读 · 0 评论 -
图之关节点和重连通分量
一、介绍关节点问题主要是用在线路架设上,一旦关节点损坏,线路网就断开了。因此为避免这种情况,需要将网做出重连通图。关节点更像是把图分成了两部分,而这两部分只通过这个关节点链接。显然如果这个关节点断了,这两个子图就无法再通信了。 二、算法基于深度搜索,有以下特性: 上面的low[w]有点不好理解,其实大致意思,如果我们在进行深度搜索时,到最深处是一个已被访问的顶点。这是我们判断这个已被访问的顶原创 2016-09-04 12:19:00 · 1617 阅读 · 0 评论 -
树之二叉树遍历先序,中序,后序
一、介绍二、遍历理解首先需明白:先序,中序,后序中的先,中,后指的是根结点的遍历顺序。 以中序遍历为例(数据读取顺序:先左树,再根结点,再右树): 1、先找到根结点,遍历了但是不能读取数据,此时树被分成两个子树,分别称为左树1,右树1。 2、对于左树1,我们把它当成新的一棵树。先访问根结点,遍历了但是不能读取数据,左树1左边为叶子 读取数据(a),然后读取根结点 (+)。左树1右边为子树,姑原创 2016-09-05 19:46:31 · 692 阅读 · 0 评论 -
树之性质
总边数+1=总结点在一棵度为3的树中,度为3的结点有2个,度为2的结点有1个,度为1的结点 有2个,那么,该树有 __个叶结点。设度为0的结点个数为n0,度为1的结点个数为n1,度为2的结点个数为n2,度为3的个数n3树中结点总数n0+ n1 + n2 + n3,所有边的数量为0 * n0 + 1 * n1 + 2 * n2 + 3 * n3树中结点比边多1个,合并这两个式子就可以得到:n0原创 2016-09-06 18:04:16 · 1317 阅读 · 0 评论 -
文件之索引文件
索引文件指的是为逻辑记录和物理记录之间建立一个一一对应关系表–索引表。 在检索过程中,分两步,首先查找索引表,如果存在该记录,则根据索引项的指示读取外存。 如果索引表很大,可以再为索引表建立查找表。如下图: 设文件索引节点中有7个地址项,其中4个地址项为直接地址索引,2个地址项是一级间接地址索引,1个地址项是二级间接地址索引,每个地址项大小为4字节(KB),若磁盘索引块和磁盘数据块大小均原创 2016-09-07 16:54:09 · 11029 阅读 · 0 评论 -
分治策略之最大子数组
一、基本思想 分治策略是将父问题差分成的多个子问题,然后递归的方式解决子问题。整个思想和动态规划类似,不过分治策略不要求最优解问题,而只是把父问题分解成子问题。步骤: 分解(Divide)先将问题划分成子问题。子问题的形式与原问题相同。 解决(Conquer)递归解决问题,当问题缩小到一定程度就能够直接求解。 合并(Combine)当最小子问题解决后,递归已经触底回归,逐渐将子问原创 2016-09-26 14:10:06 · 1037 阅读 · 0 评论 -
选择排序之堆排序(HeapSort)
一、堆定义 (二叉)堆是一个数组,类似于完全二叉树。分为两种形式: 二、维持堆性质 堆排序使用的是最大堆,如果堆中某个结点不满足最大堆性质,这时就需要用算法调整节点位置,使得满足最大堆性质。 三、建堆 默认数组为一个无序堆,通过数组前部分数组调用MAX-HEAPIFY函数来调整节点来使其满足最大堆性质。 四、堆排序 由于堆已经排好序,我们只需要逐渐取出节点就可以完成排序。堆原创 2016-09-26 23:15:09 · 600 阅读 · 0 评论 -
选择排序之树形选择排序(TreeSelectionSort)
一、简单选择排序思想 很显然,每次我们比较后就把数据进行交换,取出了关键字最小的记录,但是对于与最小关键字记录交换的数据我们直接扔进了乱序中,没有利用这次比较。导致每次选择都要重新比较。 二、树形选择排序为了减少简单选择排序,我们利用前n-1次比较信息,减少下次选择。类似于锦标赛。根据锦标赛传递关系。亚军只能从被冠军击败的人中选出。 、 实际算法中,我们把需要比较的记录全部作为叶子,然后从叶原创 2016-09-26 23:56:06 · 13792 阅读 · 7 评论 -
内部排序之归并排序(MergingSort)
一、基本思想 将两个已经排序好的有序列表合并成一个新的有序表。根据分治策略,我们会发现从上往下,就是将一个乱序表一直递归划分,划分到最后就只剩一个元素,显然有序。二、示意图 从底下往上看,整个算法就像分治策略中的最大子数组问题。 最大子数组问题三、算法整个算法分为两个部分,一个是对两个有序子表的合并;一个是对乱序表的划分。 合并: 这部分很简单,就是逐个读取连个子表的最小值。 划原创 2016-09-27 11:14:33 · 1192 阅读 · 0 评论 -
内部排序之基数排序(RadixSort)
一、基本思想 基数排序借助的多关键字进行排序的思想对单逻辑关键字进行排序。 二、链式基数排序 如果我们对0至999之间的数据进行排序,首先它的关键逻辑关键字就是关键的字的大小。如果采用插入排序,直接比较大小就行了。但是基数排序不同,分析关键字我们知其有三位,个位,十位,百位。基数排序就是利用将单个关键字分成多个关键字。逐次对关键字进行排序,最后收集成一个完整有序列表。原创 2016-09-27 12:20:40 · 1428 阅读 · 0 评论 -
静态查找之顺序查找、折半查找、裴波那契查找、插值查找、索引顺序表查找(分块查找)
一、顺序查找 对于乱序表,从表的一端逐个比较,如果相等则查找成功,如果到底还没找到,则查找不成功。二、折半查找 基于有序表,由于表是从大到小或者从小到大排序。所以我们可以取表中间一个记录,判断查找内容在哪个区间内。一直循环直到最后low&amp;amp;gt;high。 三、索引顺序表 索引顺序表利用了无序表和有序表的特点。其索引表为有序表,可以使用折半查找,而记录表则是无序的,不过其有个特点。原创 2016-09-28 14:21:34 · 1747 阅读 · 0 评论 -
【动态规划】最长公共子序列与最长公共子串
来源1. 问题描述子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串cnblogs belong比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与母串保持一致,我们将其称为公共子序列。最长公共子序列(Longest Common Subsequence, LCS),顾名思义,是指在所有的子序列中最长的那一个。子串是要求更严格的一种...转载 2019-07-15 23:28:17 · 174 阅读 · 0 评论