[算法笔记]
MarioFei
这个作者很懒,什么都没留下…
展开
-
【分治思想理解】divide and conque
一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时转载 2014-02-26 10:16:07 · 740 阅读 · 0 评论 -
动态规划之背包
苹果时间限制:3000 ms | 内存限制:65535 KB难度:2描述ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。输入有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来的n行,每行2个转载 2014-03-23 22:34:21 · 541 阅读 · 0 评论 -
素数测试(2)
4.wilson检测(威尔逊检测)读过数论的朋友一定看过wilson算法,在数论中,威尔逊定理给出了判定一个自然是否为素数的充分必要条件,即:当且仅当p为素数时:( p -1 )! ≡ -1 ( mod p )如果您没接触过数论,帮您解释下这个式子是啥意思,(mod p)叫同余 意思就是除以p后余数相等,可以把上述式子理解为当且仅当p为素数时,[(p-1)!+1]%p == 0转载 2014-04-18 16:38:57 · 964 阅读 · 0 评论 -
并查集(2)
再优化更好的方法是什么,,原创 2014-04-03 21:53:05 · 580 阅读 · 0 评论 -
并查集(3)
进一步优化——路径压缩原创 2014-04-04 16:48:49 · 585 阅读 · 0 评论 -
贪心算法之活动规划问题
前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给出活动选择问题的详细分析过程,并给出详细的实现代码进行测试验证。关于贪心算法的详细分析过程,下次在讨论。1、活动选择问题描述 有一个需转载 2014-04-05 11:34:50 · 953 阅读 · 0 评论 -
矩阵乘积验证器
对于矩阵乘积,大家应该都是比较熟悉的,我们原创 2014-04-20 12:02:47 · 1250 阅读 · 0 评论 -
贪心算法之克鲁斯卡尔算法
最小生成树性质:设G=(V,E)是一个连通网络,U是顶点集V的一个真子集。若(u,v)是G中一条“一个端点在U中(例如:u∈U),另一个端点不在U中的边(例如:v∈V-U),且(u,v)具有最小权值,则一定存在G的一棵最小生成树包括此边(u,v)。原创 2014-04-05 13:20:13 · 1822 阅读 · 0 评论 -
回溯求解0-1背包
回溯求解0-1背包原创 2014-04-20 17:46:22 · 1708 阅读 · 0 评论 -
堆排序
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。【大于左右孩子||小于左右孩子】 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2转载 2014-03-26 15:31:21 · 1132 阅读 · 0 评论 -
贪心算法之哈夫曼编码
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码。哈夫曼编码是哈夫曼树的一个应用。哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码。 首先介绍什么是哈夫曼树。哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结转载 2014-04-06 15:36:48 · 4120 阅读 · 0 评论 -
MST性质的证明
什么是MST?MST就是Most Small Tree,应该就是最小生成树的意思吧,具体不是很清楚,MST性质就是最小生成树性质(以下简称MST性质),我们在看最小生成树的算法的时候,很多情况下都有关于这条性质的说明,比如,历史上最经典的Prim算法和Kruskal算法就是根据这个性质演算出来的Algorithm,MST性质的声明如下:最小生成树性质:设G=(V,E)是一个连通网络,U是顶转载 2014-03-26 23:07:59 · 1150 阅读 · 0 评论 -
前缀表达式求值
表达式求值时间限制:3000 ms | 内存限制:65535 KB难度:3描述Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。假设表达式可以简单定原创 2014-03-26 17:41:18 · 1644 阅读 · 0 评论 -
贪心算法之区间覆盖问题
贪心算法之区间覆盖问题原创 2014-04-08 22:09:32 · 7645 阅读 · 2 评论 -
回溯算法之八皇后问题
N 皇后问题是在N×N 的国际象棋棋盘上, 放置N 个皇后,使任何两个皇后都不能相互攻击。也就是说, 任何两个皇后, 都不在同一行、同一列或同一斜线上。N 皇后问题是由八皇后问题演化而来的。八皇后问题于1848 年由国际象棋棋手MaxBazzel 提出。八皇后问题自从提出之后, 吸引了许多著名数学家的关注, 其中包括Carl Gauss。近年来, N 皇后问题成为计算机应用领域内的一个经典问题,原创 2014-04-10 18:50:10 · 1890 阅读 · 0 评论 -
回溯算法(1)
回溯算法框架总结原创 2014-04-10 16:45:56 · 1983 阅读 · 0 评论 -
贪心算法之寻找最大数
寻找最大数时间限制:1000 ms | 内存限制:65535 KB难度:2描述请在整数 n中删除m个数字,使得余下的数字按原次序组成的新数最大,比如当n=92081346718538,m=10时,则新的最大数是9888 输入第一行输入一个正整数T,表示有T组测试数据每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,转载 2014-04-13 20:09:01 · 1235 阅读 · 0 评论 -
动态规划之回文字符串
回文字符串时间限制:3000 ms | 内存限制:65535 KB难度:4 描述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入第一行给出整数N(0转载 2014-03-23 08:08:52 · 965 阅读 · 0 评论 -
并查集理解(1)
在某个城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足:我朋友的朋友是我的朋友;我敌人的敌人是我的敌人;已知关于 n个人的m条信息(即某2个人是朋友或者敌人),假设所有是朋友的人一定属于同一个团伙,请计算该城市最多有多少团伙?我们考虑如何实现?【ps:关系逐个录入的】Thinking~~分析一下1.一开始集合是逐个自成一派的,假设有n原创 2014-04-02 22:26:19 · 2768 阅读 · 0 评论 -
素数测试总结(1)
所谓素性测试是检测一个数是否为素数的测试。而对素数的研究是有很长一段历史,把素数的东西写成一本书的话也许得上千页,而现代密码学又加深了科研工作者对素数的研究,今天就以输出100以内的素数的为例,讲讲素性测试的几种方法。1.试除法这可能是每个学过计算机的朋友都敲过的代码,原理就是从判断2到sqrt(n)或者n/2能不能整除n,若能整除就不是素数。转载 2014-04-17 22:21:39 · 797 阅读 · 0 评论 -
分治算法之二分搜索--Binary
二分搜索折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:二分搜原创 2014-02-26 11:45:13 · 1620 阅读 · 0 评论 -
分治算法之大整数乘法--big mutiply
1)大整数乘法书上讲述的是2个位数都为n位的数相乘,我这里扩展一下,写一个更为一般的方法,任意位数的2个数相乘:对于任意位数的2个数相乘a * b,写成:a = a1 * 10^(n1/2) + a0 -----n1为a的位数b = b1 * 10^(n2/2) + b0 -----n2为b的位数分治策略就是基于以上变换转载 2014-02-26 15:16:41 · 2250 阅读 · 0 评论 -
分治算法之矩阵运算
4.3、矩阵乘法4.3.1、传统方法4.3.2、简单分治法划分步骤:将矩阵A、B 分成4 个n/2×n/2 的矩阵;治理步骤:当n>1 时,递归计算8 个n/2×n/2 的矩阵的乘积;组合步骤:计算治理步骤得到n/2×n/2 的矩阵的和。4.3.3、Strassen矩阵乘法转载 2014-02-28 18:02:19 · 3302 阅读 · 0 评论 -
【动态规划思想理解】dynamic programming
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能转载 2014-03-02 11:16:32 · 923 阅读 · 0 评论 -
分治算法之快速排序
快速排序是对冒泡排序的一种改进。基本思想是每次排序将序列分为两部分,每一部分的数据都比另一部分的数据要小,即取序列中的某个值为中间值,第一个子序列中每一个数据的值都比这个中间值小,第二个序列中每一个数据的值都比这个中间值大。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。时间复杂度:平均O(nlogn) 。最坏情况O(n^2) 。原创 2014-03-10 19:58:09 · 873 阅读 · 0 评论 -
动态规划之流水线问题--pipeline
很多参考书在讲解动态规划算法的时候都会使用到一个例子----流水线的装配调度问题。如图所示:从in进入到流水线1需要e1的时间,这里的每个表格代表一个装配站,在同一条流水线中,从一个装配站到另一个装配站是不需要时间的,而跨流水线则需要时间,我们定义一个数组t来保存流水线的切换时间,(例如:从流水线1【2】到流水线2【3】),那么这个时间为t[1][2],在每个装配站上装配也需要时间转载 2014-03-06 17:09:24 · 3028 阅读 · 0 评论 -
动态规划之最长子序列问题
单调递增最长子序列时间限制:3000 ms | 内存限制:65535 KB难度:4描述求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4输入第一行一个整数0随后的n行,每行有一个字符串,该字符串的长度不会超过10000输出输出字符串的最长递增子序列的长度样例输入3aaaababcabklm原创 2014-03-15 14:10:09 · 1111 阅读 · 0 评论 -
动态规划之最长公共子序列问题
最长公共子序列时间限制:3000 ms | 内存限制:65535 KB难度:3描述咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合原创 2014-03-15 16:42:24 · 776 阅读 · 0 评论 -
枚举算法简介
枚举算法:也称穷举算法,它是编程中常用的一种算法。在解决某些问题的时候,可能无法按照一定规律从众多的候选答案中找出正确的答案。此时,可以从众多的候选解中逐一取出候选答案,并验证候选答案是否为正确的答案。这种方法就是枚举算法。 缺点:运算量比较大,接替效率不高。如果枚举的范围太大,在时间上就难以承受。 优点:思路简单,程序编写和调试方便。转载 2014-03-16 00:10:02 · 2942 阅读 · 0 评论 -
HDOJ-1050贪心
Problem DescriptionThe famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in the following figure. The floor has 200 rooms each on the north sid转载 2014-04-13 18:44:37 · 581 阅读 · 0 评论 -
算法设计与分析--小算法问题总结
算法设计与分析的课程中老师留了两个小问题,这个和大家分享,问题不难,但是思想值得总结1.5个数字排序在7次比较内完成?【最坏情况】看起来很容易,其实仔细分析一下,还是不容易得到的1.使用插入排序 最坏情况当然是逆序的时候 竟然要比较10次 2.使用冒泡排序 是n*(n-1)/2=103.使用归并排序 显示也会大于7次4.使用快速排序原创 2014-03-19 10:46:49 · 911 阅读 · 0 评论 -
基数排序
计数排序的缺点很明显,需要额外的空间C来作为计数数组,虽然时间复杂度为O(n+k),但当输入序列里元素取值很大的时侯,如k=O(n2),时,此时时间复杂度已经达到n2数量级了,空间的消耗也是让人无法承受的。这里介绍一种另一种线性排序算法——基数排序,可以应对数值很大的情况。基数排序,即一个数位一个数位地进行排序,平常生活中我们经常使用的一种算法思想:如要对一个日期进行排序,日期中由转载 2014-04-15 08:07:46 · 871 阅读 · 0 评论 -
最大子矩阵【最大连续子串和的衍生】
最大和时间限制:1000 ms | 内存限制:65535 KB难度:5描述给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 例子:0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为:9 2转载 2014-03-19 22:44:51 · 845 阅读 · 0 评论 -
并查集理解【真的很震撼】
本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构,称为Union-Find。更多的信息可以参考Algorithms 一书的Section 1.5,实际上本文也就是基于它的一篇读后感吧。原文中更多的是给出一些结论,我尝试给出一些思路上的过程,即为什么要使用这个方法,而不是别的什么方法。我觉得这个可能更加有意义一些,相比于记下一些结论。关于转载 2014-03-31 19:56:21 · 647 阅读 · 0 评论 -
贪心算法概述
1.定义概览贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题转载 2014-03-20 21:56:33 · 1286 阅读 · 0 评论 -
动态规划之背包变种
邮票分你一半时间限制:1000 ms | 内存限制:65535 KB难度:3描述 小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明。每张邮票上都有分值,他们想把这些邮票分成两份,并且使这两份邮票的分值和相差最小(就是小珂得到的邮票分值和与小明的差值最小),现在每张邮票的分值已经知道了,他们已经分好了,你知道最后他们得到的邮票分值和相差多少吗?转载 2014-03-31 23:01:47 · 622 阅读 · 0 评论 -
伪随机数生成算法(1)线性同余法
线性同余随机数生成器介绍:古老的LCG(linear congruential generator)代表了最好最朴素的伪随机数产生器算法。主要原因是容易理解,容易实现,而且速度快。 LCG 算法数学上基于公式:X(n+1) = (a * X(n) + c) % m其中,各系数为:模m, m > 0系数a, 0 增量c, 0 原始值(种子) 0转载 2014-04-29 09:05:22 · 9764 阅读 · 0 评论