![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法笔记
不务正业的土豆
知行合一 止于行善
展开
-
树状数组详解(含排兵布阵例子)
1 树状数组简介 树状数组,其实就是物理上存储是连续的,以数组的形式存储,逻辑上可以得到树形的父子关系。对于两个数组下标x,y(x < y),如果y=x + 2^k (k等于x的二进制表示中末尾0的个数),那么定义(y, x)为一组树上的父子关系,其中y为父结点,x为子结点。 如上图所示,其中A为普通数组,C为树状数组(C在物理空间上和A一样都是连续存储的,其实真正的数组A我们是不需要的原创 2017-09-06 16:27:32 · 1364 阅读 · 0 评论 -
深度优先搜索-地宫取宝
问题描述 X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。 地宫的入口在左上角,出口在右下角。 小明被带到地宫的入口,国王要求他只能向右或向下行走。 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。 请你帮原创 2017-03-04 16:30:39 · 259 阅读 · 0 评论 -
动态规划算法求解硬币找零问题
动态规划算法求解硬币找零问题1.问题描述 现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱。2.分析 动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就原创 2017-02-15 11:28:11 · 2316 阅读 · 0 评论 -
搜索题-危险系数
问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用。地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。我们来定义一个危险系数DF(x,y):对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两原创 2017-03-08 23:45:25 · 316 阅读 · 0 评论 -
动态规划算法常见题型
动态规划算法常见题型一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过原创 2017-02-17 09:45:47 · 868 阅读 · 0 评论 -
线段树
线段树是一棵完全二叉树,它在各个节点保存一条线段(数组中的一段子数组),由于二叉结构的特性,它基本能保持每个操作的复杂度为O(lgN),从而大大减少耗时。树中的每一个结点表示了一个区间[a,b]。a,b通常是整数。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2,b](除法去尾取整),线段树需要原创 2017-03-26 10:37:35 · 385 阅读 · 0 评论 -
七大排序算法
1.选择排序 基本思想:选择排序的基本思想是遍历数组的过程中,以 i 代表当前需要排序的序号,则需要在剩余的 [i…n-1] 中找出其中的最小值,然后将找到的最小值与 i 指向的值进行交换。因为每一趟确定元素的过程中都会有一个选择最大值的子流程,所以人们形象地称之为选择排序。 选择排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1) 。例子:public class SelectSor原创 2017-03-25 11:00:11 · 281 阅读 · 0 评论 -
DFS-有向图-排涝问题
到了雨季农业生产的排涝就成了一个大问题。为了保证植物生长的顺利,某县政府决定投资为农田区建立一些排涝渠,将农田里多余的水排到小溪里。输入第1行包括用一个空格分隔的两个整数N和M,N表示县政府专家设计的排涝渠的数量,M是排涝渠交叉点的数量。其中第一个交点是农田区,交点M是小溪(0≤N≤200,2≤M≤200)。第2行-第N+1行中每行有三个用空格分隔的整数,Si、Ei和Ci。Si和Ei说明了排涝渠的端原创 2017-03-23 11:34:52 · 438 阅读 · 0 评论 -
Dijkstra-单源最短路径
public class Dijkstra { static int g[][]; static int dist[];//源点到各点的距离 static boolean known[];//各店是否知道最短路径 static int [] prev;//prev:各点最短路径点的前一点 public static void main(String[] arg原创 2017-04-07 21:08:20 · 317 阅读 · 0 评论 -
DFS-危险系数(求图中割点数)
问题描述 抗日战争时期,冀中平原的地道战曾发挥重要作用。地道的多个站点间有通道连接,形成了庞大的网络。但也有隐患,当敌人发现了某个站点后,其它站点间可能因此会失去联系。我们来定义一个危险系数DF(x,y):对于两个站点x和y (x != y), 如果能找到一个站点z,当z被敌人破坏后,x和y不连通,那么我们称z为关于x,y的关键点。相应的,对于任意一对站点x和y,危险系数DF(x,y)就表示为这两原创 2017-03-10 01:17:07 · 551 阅读 · 0 评论 -
邻接表构图-网络寻路题解
问题描述X 国的一个网络使用若干条线路连接若干个节点。节点间的通信是双向的。某重要数据包,为了安全起见,必须恰好被转发两次到达目的地。该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同的转发路径。源地址和目标地址可以相同,但中间节点必须不同。如下图所示的网络。1 -> 2 -> 3 -> 1 是允许的1 -> 2 -> 1 -> 2 或者 1 -> 2 -> 3 ->2 都是非法的。输原创 2017-03-12 01:30:13 · 691 阅读 · 0 评论 -
动态规划-最短编辑距离变形----DNA对比问题
问题描述: 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧核苷酸(dAMP、dGMP、dCMT和dTMP)通过磷酸二酯键连接而成。这4种核苷酸可以分别记为:A、G、C、T。 DNA携带的遗传信息可以用形如:AGGTCGACTCCA…. 的串来表示。DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。 为了简化问题,我们假设,原创 2017-03-20 10:57:31 · 2330 阅读 · 0 评论 -
三种典型的博弈论问题(巴什博奕、威佐夫博奕、尼姆博奕)
问题描述 小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。输入格式 两个正整数,表示每种原创 2017-02-24 14:16:34 · 7604 阅读 · 2 评论 -
贪心算法 - 删数问题
删数问题: 给定一个n位正整数a,删掉其中任意k(k<=n)个位,剩下的为按原顺序形成一个新的正整数。 找出剩下的数字最小的删树方案。 输入:a>0,n位,0/** * 删数问题 * 给定一个n位正整数a,删掉其中任意k(k<=n)个位,剩下的为按原顺序形成一个新的正整数。 * 找出剩下的数字最小的删树方案。 */ public class RemoveNumBits {原创 2017-02-20 15:21:50 · 1587 阅读 · 1 评论 -
贪心算法 - 单源最短路径 Dijkstra
单源最短路径: 一个带权有向图G=(V,E),其中n个顶点Vertex,以及连接各个顶点之间的边Edge,可能有些顶点之间没有边,每条边上的权值都是非负值。 给定其中的一个顶点,称之为源。 求出源到其他所有顶点之间的最短路径。解法: Dijkstra算法 以源为起始顶点集合S,向外扩张, 将从源到其他顶点且只经过S中顶点的路径,称为特殊路径。 每次都将S之外的顶点中的 特殊路径长度最短原创 2017-02-20 15:19:14 · 779 阅读 · 0 评论 -
贪心算法 - 最小生成树 Prim算法
一个无向带权图G=(V,E),其中n个顶点Vertex,以及连接各个顶点之间的边Edge,可能有些顶点之间没有边,每条边上的权值都是非负值。 生成树: G的一个子图,包含了所有的Vertex,和部分的Edge。 最小生成树: 所有的生成树中,各条Edge上的权值总和最小的一个。 例子:设计通信网络时,各个城市之间铺设线路,最经济的方案。 最小生成树性质: G=(V,E), S是V的真原创 2017-02-20 15:15:53 · 1131 阅读 · 0 评论 -
贪心算法 - 最小生成树 Kruskal算法
关于最小生成树的概念,请参考前一篇文章:Prim算法。 Kruskal算法: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小。 把找到的这两个顶点联合起来。 初始时,每个顶点各自属于自己的子集合,共n个子集合。 每一步操作,都会将两个子集合融合成一个,进而减少一个子集合。 结束时,所有的顶点都在同一个子集合里,这个子集合就是最小生成树。 例子:算法过程原创 2017-02-20 15:11:51 · 2643 阅读 · 0 评论 -
贪心算法 - 哈夫曼编码 Huffman
贪心算法 - 哈夫曼编码 Huffman哈夫曼编码: 一种字符编码方式,常用于数据文件压缩。压缩率通常在20%~90%。 主要思想: 采取可变长编码方式,对文件中出现次数多的字符采取比较短的编码,对于出现次数少的字符采取比较长的编码,可以有效地减小总的编码长度。 例如,在英文中,e的出现频率最高,z的出现频率最低,所以可以用最短的编码来表示e,用最长的编码表示z。 例子: 一个文件包含1原创 2017-02-20 15:07:36 · 1454 阅读 · 0 评论 -
旅行商问题
旅行商问题1 问题描述 何为旅行商问题?按照非专业的说法,这个问题要求找出一条n个给定的城市间的最短路径,使我们在回到触发的城市之前,对每个城市都只访问一次。这样该问题就可以表述为求一个图的最短哈密顿回路的问题。(哈密顿回路:定义为一个对图的每个顶点都只穿越一次的回路)很容易看出来,哈密顿回路也可以定义为n+1个相邻顶点v1,v2,v3,…,vn,v1的一个序列。其中,序列的第一个顶点和最后一个顶原创 2017-02-19 20:16:54 · 3242 阅读 · 0 评论 -
经典回溯算法(八皇后问题)详解
经典回溯算法(八皇后问题)详解八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(斜率为1),问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,原创 2017-02-19 19:46:45 · 2943 阅读 · 1 评论 -
走迷宫回溯算法
走迷宫回溯算法以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1) 根据二维数组,输出迷宫的图形。 (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。 例子: 左上角(1,1)为入口,右下角(8,9)为出口。 可使原创 2017-02-19 13:19:36 · 1335 阅读 · 0 评论 -
贪心算法-活动安排问题
贪心算法贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解,如之前的Dijkstra算法,Prim算法,Kruskal算法。如果不要求绝对最佳答案,那么有时候我们使用简单的贪婪算法生成近似的答案.贪心与动态规划原创 2017-02-20 14:51:04 · 1062 阅读 · 0 评论 -
动态规划-波动数列
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 …这个数列中后一项总是比前一项增加2或者减少3。 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减少b的整数数列可能有多少种呢? 输入格式 输入的第一行包含四个整数 n s a b,含义如前面说述。 输出格式 输出一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方原创 2017-02-28 01:08:26 · 1213 阅读 · 0 评论 -
贪心算法-背包问题
背包问题-贪心法完全背包问题 一个旅行者有一个最多能用m公斤的背包,现在有n种物品,每件的重量分别是W1,W2,…,Wn, 每件的价值分别为C1,C2,…,Cn.若的每种物品的件数足够多. 求旅行者能获得的最大总价值。贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能原创 2017-02-17 16:49:02 · 1514 阅读 · 0 评论 -
贪心算法-大整数乘法/加法/减法
设有两个大整数相乘,X=61438521,Y=94736407.那么XY=5820464730934047.易知我么的算法需要O(N²)即O(8²)次操作. 如果我们把X和Y都拆成两半,由最高几位和最低几位组成.那么XL=6143,XR=8521,YL=9473,YR=6470.于是X=XL*10^4+XR,Y=YL*10^4+YR.可以得到 XY=XL*YL*10^8+(XL*YR+XR*YL原创 2017-02-20 17:39:41 · 721 阅读 · 0 评论 -
贪心算法-翻硬币
问题描述 小明正在玩一个“翻硬币”的游戏。桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。比如,可能情形是:**oo***oooo如果同时翻转左边的两个硬币,则变为:oooo***oooo现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?我们约定:把翻动相邻的两个硬币叫做一步操作,原创 2017-02-22 12:25:12 · 1633 阅读 · 0 评论 -
动态规划-矩阵连乘问题
题目 给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i = 1,2, …n-1。考虑这n个矩阵的乘积。由于竞争乘法满足结合律,故计算矩阵的连乘有许多不同的计算次序。 这种计算次序可以用加括号的方式确定。若一个矩阵连乘的计算次序完全确定,这是就说该连乘已完全加括号。 例如,矩阵连乘A1 A2 *A3 *A4 可以有5种完全加括号的方式:(A1 (A2原创 2017-02-20 23:05:06 · 1046 阅读 · 0 评论 -
贪心算法-泊松分酒问题
讲这道题纯粹就是比较好玩,就记录一下.泊松分酒是很著名的一道题,讲的是假设某人有12品脱的啤酒一瓶,想从中倒出六品脱,但是恰巧身边没有6品脱的容器,仅有一个8品脱和一个5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?代码:import java.util.LinkedList;import java.util.Set;public class Oil { static class Sta原创 2017-02-20 17:50:12 · 3935 阅读 · 1 评论 -
贪心算法-最近点对问题
这个问题真的很有意思,给定空间上的n个节点S={(xi,yi)},如何查找这n个点对中最近的点对的距离? 我们都知道两点间距离:((xi-xj)²+(yi-yj)²)1/2 那么如果使用暴力搜索,需要两两检测,需要花费O(N²). 我们可以采用分治法的思想.首先我们假设这些点都已经按照x坐标排序过,那么可以在中间画一条线,把点集分为Pl和Pr,那么最近的一对点要么都在Pl中,要么都在Pr中,要么原创 2017-02-20 17:47:19 · 1587 阅读 · 0 评论 -
贪心算法-Strassen矩阵乘法
两个矩阵的乘法学过线性代数的都知道怎么求,一般来说复杂度为O(N^3).直接给出标准的算法代码:public class MartixMultiply { public static int[][] multiply(int[][] a, int[][] b) { int n = a.length; int[][] c = new int[n][n]; for (int原创 2017-02-20 17:43:34 · 611 阅读 · 0 评论 -
动态规划之背包问题01
动态规划之背包问题011.问题描述 背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大?2.分析 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了。原创 2017-02-17 13:30:36 · 366 阅读 · 0 评论