算法
崔世勋
这个作者很懒,什么都没留下…
展开
-
蒙地卡罗法求PI
说明蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名。蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式。解法蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值;假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1。...原创 2014-07-10 21:14:51 · 786 阅读 · 0 评论 -
最近公共祖先、区间最小值查询
第一节 RMQ、LCA概述 LCA:Lowest Common Ancestor,译为最近公共祖先。其解释就是说:在有根树中,找出树中任意两个节点最近的公共祖先,或者说找到任意两个节点离树根最远的公共祖先。 RMQ:Range Minimum Query,译为区间最小值查询。其解释就是说:对于含有N个元素的数列A,在数列中找到两个指定索引之间的最小值及最...转载 2014-08-23 21:31:34 · 742 阅读 · 0 评论 -
A*(路径搜索)算法
A*算法是路径搜索中的经典算法,也是公认的最优算法之一。 开始:搜索区域这里假设有人要从A点去往B点,另外有一面墙将两者分开。如下图所示,绿色方块代表A点,红色方块代表B点,蓝色代表分开他们的墙。 图一首先要注意的是我们这里先将整个搜索区域网格化,以方便路径搜索。这一方法将搜索区域简化为一个简单的2为数组。数组的每个元素代表网格上的一片区域,并且标记为可通过或不可通过两种状...转载 2014-08-25 21:30:25 · 3514 阅读 · 0 评论 -
图论基础
图的表示法图G = (V, E)的表示有邻接表和邻接矩阵两种形式。通常,对于| E |远小于| V | ^ 2的稀疏图,用邻接表比较合适。若图稠密或很小,或必须很快判别给定的两个顶点是否存在连接的边时,通常用邻接矩阵表示法。 关键点(Articulation Point)和桥(Bridge)对于图G = (V, E),若移除点v可以把图分离,那么v是一个关键点。若移除边e可以把图分...转载 2014-08-25 21:13:57 · 687 阅读 · 0 评论 -
最大流问题
最近又复习了下最大流问题,每次看这部分的内容都会有新的收获。可以说最大流问题的资料网上一搜一大把,根本没有必要自己写;但是大部分资料上的专业术语太多了,初学很难理解,至少我当年学这部分的时候前几次就没有看懂。所以我准备备份一点个人的理解。图-1 如图-1所示,在这个运输网络中,源点S和汇点T分别是1,7,各边的容量为C(u,v)。图中红色虚线所示就是一个可行流。标准图示法如图-2...转载 2014-08-26 09:16:41 · 1059 阅读 · 0 评论 -
模拟退火算法
一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为...转载 2014-08-26 16:04:53 · 792 阅读 · 0 评论 -
背包问题
背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的第一部分。1-背包问题 描述有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路 这是最基础的背包问题,特点是:每种物品仅有一...转载 2014-08-25 20:42:39 · 635 阅读 · 0 评论 -
字符串匹配
字符串的匹配包括蛮力匹配算法,KMP算法,BM算法,Horspool算法,Sunday算法,fastsearch算法,KR算法等等。 本文主要介绍KMP算法和BM算法,它们分别是前缀匹配和后缀匹配的经典算法。所谓前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从左到右;所谓后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右。看得出来前缀匹配和后缀匹配的区别...转载 2014-08-26 15:12:24 · 841 阅读 · 0 评论 -
二分图匹配算法
一、二分图最大匹配 二分图最大匹配的经典匈牙利算法是由Edmonds在1965年提出的,算法的核心就是根据一个初始匹配不停的找增广路,直到没有增广路为止。 匈牙利算法的本质实际上和基于增广路特性的最大流算法还是相似的,只需要注意两点:(一)每个X节点都最多做一次增广路的起点;(二)如果一个Y节点已经匹配了,那么增广路到这儿的时候唯一的路径是走到Y节点的匹配点(可以回忆最大流算法中的...转载 2014-08-26 14:25:37 · 964 阅读 · 0 评论 -
状态压缩动态规划
动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。 *:一般有个数据 n<16 或者 n<32 这个很可能就是状态DP的标志,因为我们要用一个int的二进制来表示这些状态。要注意好这些数据规模的提示作用。 *:确定了为状态DP,那么第一步就是预处理...转载 2014-08-26 20:24:05 · 574 阅读 · 0 评论 -
trie树
Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。其高效率是以空间为代价的. 性质根节点不包含字符,除根节点外每一个节点都只包含一个字符 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符都不相同例如,单词序列a, to, tea, ted, ten, i, in, inn,对应的trie。下面以英文单词构...转载 2014-08-26 19:25:58 · 487 阅读 · 0 评论 -
AC自动机
AC算法思想:用多模式串建立一个确定性的树形有限状态机,以主串作为该有限状态机的输入,使状态机进行状态的转换,当到达某些特定的状态时,说明发生模式匹配。AC自动机算法分为3步:构造一棵Trie树,构造失败指针和模式匹配过程。构造失败指针简单的说:设这个节点上的字母为C,沿着他父亲的失败指针走,直到走到一个节点,他的儿子中也不字母为C的节点。然后把当前节点的失败指针指向那个字母也为C的儿...转载 2014-08-26 19:08:36 · 605 阅读 · 0 评论 -
二分查找
用伪代码来表示, 二分查找算法大致是这个样子的:left = 0, right = n -1while (left <= right) mid = (left + right) / 2 case x[mid] < t: left = mid + 1; x[mid] = t: p = mid; break; ...转载 2014-08-27 20:32:30 · 568 阅读 · 0 评论 -
初识EM algorithm
很多书阐述了EM algorithm的原理,直接点可以在维基百科上找到它的基本情况:http://en.wikipedia.org/wiki/Expectation%E2%80%93maximization_algorithm。EM算法分两步走即E步和M步,和很多书本和文章中一样,维基中只给出了核心结论,至于其中的数理逻辑关系并没有给出,需要探究EM算法的推导过程可以参考JerryLead...转载 2014-08-23 21:18:17 · 707 阅读 · 0 评论 -
欧几里德算法和扩展欧几里德算法
欧几里德算法欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(...转载 2014-08-23 21:11:01 · 897 阅读 · 0 评论 -
河内之塔
说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒...原创 2014-07-10 19:42:12 · 707 阅读 · 0 评论 -
Fibonacci数列
说明Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产。起初只有一只免子,一个月后就有两只免子,二个月后有三只免子,三个月后有五只免子(小免子投入生产)......。如果不太理解这个例子的话,举个图就知道了,注意新生的小免子需一个月成长期才会投入生产,类似的道理也可以用于植物的生长,这就是Fibonacci数列,例如...原创 2014-07-10 19:47:02 · 654 阅读 · 0 评论 -
最大公因数、最小公倍数、因式分解
说明最大公因数使用辗转相除法来求,最小公倍数则由这个公式来求:GCD*LCM=两数乘积 解法最大公因数可以使用递回与非递回求解,因式分解基本上就是使用小于输入数的数值当作除数,去除以输入数值,如果可以整除就视为因数,要比较快的解法就是求出小于该数的所有质数,并试试看是不是可以整除。 #include <stdio.h>#include <stdlib....原创 2014-07-10 21:43:48 · 1335 阅读 · 0 评论 -
筛选求质数
说明除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计人员与数学家努力的课题,在这边介绍一个着名的Eratosthenes求质数方法。解法首先知道这个问题可以使用回圈来求解,将一个指定的数除以所有小于它的数,若可以整除就不是质数,然而如何减少回圈的检查次数?如何求出小于N的所有质数?首先假设要检查的数是N好了,则事实上只要检查至N的开根号就可以了...原创 2014-07-10 21:24:06 · 803 阅读 · 0 评论 -
Three-Color Flag
说明 三色旗的问题最早由E.W.Dijkstra所提出,他所使用的用语为Dutch Nation Flag(Dijkstra为荷兰人),而多数的作者则使用Three-Color Flag来称之。 假设有一条绳子,上面有红、白、蓝三种颜色的旗子,起初绳子上的旗子颜色并没有顺序,您希望将之分类,并排列为蓝、白、红的顺序,要如何移动次数才会最少,注意您只能在绳子上进行这个动作,而且一次只...原创 2014-07-10 19:57:43 · 882 阅读 · 0 评论 -
老鼠走迷官(一)
说明老鼠走迷宫是递归求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁,使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径。解法老鼠的走法有上、左、下、右四个方向,在每前进一格之后就选一个方向前进,无法前进时退回选择下一个可前进方向,如此在阵列中依序测试四个方向,直到走到出口为止,这是递归的基本题,请直接看程序应就可以理解。 #include <stdio.h>...原创 2014-07-10 20:09:40 · 769 阅读 · 0 评论 -
完美数
说明如果有一数n,其真因数(Proper factor)的总和等于n,则称之为完美数(Perfect Number),例如以下几个数都是完美数:6 = 1 + 2 + 328 = 1 + 2 + 4 + 7 + 14496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 程序基本上不难,第一眼看到时会想到使用循环求出所有真因数,再进一步求因数和,...原创 2014-07-10 22:06:29 · 856 阅读 · 0 评论 -
超长整数运算(大数运算)
说明基于记忆体的有效运用,程式语言中规定了各种不同的资料型态,也因此变数所可以表达的最大整数受到限制,例如123456789123456789这样的整数就不可能储存在long变数中(例如C/C++等),我们称这为long数,或俗称大数运算。解法一个变数无法表示超长整数,则就使用多个变数,当然这使用阵列最为方便,假设程序语言的最大资料型态可以储存至65535的数好了,为了计算方便及符合使用十进位...原创 2014-07-10 21:31:24 · 850 阅读 · 0 评论 -
m 元素集合的n 个元素子集
说明假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些?C(m,n)=m!/n!/(m-n)!解法假设有5个元素的集点,取出3个元素的可能子集如下:{1 2 3}、{1 2 4 }、{1 2 5}、{1 3 4}、{1 3 5}、{1 4 5}、{2 3 4}、{2 3 5}、{2 4 5}、{3 4 5}这些子集已经使用字典顺序排列,如此才...原创 2014-07-11 20:14:50 · 1694 阅读 · 0 评论 -
Armstrong数
说明 在三位的整数中,例如153可以满足13 + 53 + 33 = 153,这样的数称之为Armstrong数,试写出一程序找出所有的三位数Armstrong数。 解法Armstrong数的寻找,其实就是在问如何将一个数字分解为个位数、十位数、百位数......,这只要使用除法与余数运算就可以了。例如输入input为abc,则:a = input / 100b = (i...原创 2014-07-11 19:17:18 · 2214 阅读 · 0 评论 -
最大访客数
说明 现将举行一个餐会,让访客事先填写到达时间与离开时间,为了掌握座位的数目,必须先估计不同时间的最大访客数。 解法这个题目看似有些复杂,其实相当简单,单就计算访客数这个目的,同时考虑同一访客的来访时间与离开时间,反而会使程式变得复杂;只要将来访时间与离开时间分开处理就可以了,假设访客i 的来访时间为x[i],而离开时间为y[i]。在资料输入完毕之后,将x[i]与y[i]分别进...原创 2014-07-11 19:26:00 · 936 阅读 · 0 评论 -
数字拆解
说明题目是这样的:3 = 2+1 = 1+1+1 所以3有三种拆法4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1 共五种5 = 4 + 1 = 3 + 2 = 3 + 1 + 1 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1共七种依此类推,请问一个指定数字NUM的拆解方法个数有多少个?解法...原创 2014-07-11 20:40:34 · 1305 阅读 · 0 评论 -
md5 特性 用途
MD5 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开...转载 2017-08-02 13:44:44 · 1729 阅读 · 0 评论