算法设计
kgn28
继续学习
展开
-
求次小生成树!
郁闷两天,先是写了200多行的kruskal ,后改为prim算法,只有90行,程序变简洁了,速度变快了n倍。这是kruskal算法,由于kruskal算法适用于稀疏图,故运行时间很慢虽然我已经用O(n^2)的时间求得了所用两点之间的唯一的路径上最大权值的边。方法:Compute max(u; v) for all vertices in T. Compute for an原创 2007-06-29 13:20:00 · 1413 阅读 · 0 评论 -
可计算性总结
能够想到的图灵机形式简洁且功能强大,但是图灵机形式化表示一个算法非常复杂,lambda演算则通过考察函数给出了计算的纯数学表示,使人折服于这简单之中蕴含的深刻哲理与美。α等价、β规约、 等价,层层的抽象,剑指问题本质——最简洁的数学表达。大而至道的理论研究我辈不敢触碰,通过理论学习指导实际中的程序设计可谓是现实之需。从过程到对象、泛型到函数式编程、组件利用、敏捷开发无不体现着程序设计者对快原创 2009-06-17 10:29:00 · 1723 阅读 · 1 评论 -
自己做的模幂运算太肤浅了
常说的一句话就是:“是骡子是马拉出来溜溜”,算法课上学习了素数测试的算法,可是在实践中当两个大数相乘的时候就会出现溢出的现象,上算法实验课的时候,一道题目就是要测试素数,其中有一个2^31此方级的梅森素数,如果按原来的直接相乘然后取模的方法就会出现溢出,怎么都不能通过,这道题目上卡了我半天(虽然我有差不过一年的程序设计竞赛的基础),最后还是我们系的ACM强人提供了下面的方法,改了之后才通过那道题的原创 2008-12-22 13:01:00 · 1299 阅读 · 0 评论 -
算法设计 最大网络流
算法设计 最大网络流最大网络流问题是图论中的经典问题,以前只是学习了Ford-Fulkerson方法,趁现在比较“轻闲”把网络流的Push-relabel方法也学习一下。我们知道利用最短路径的Ford-Fulkerson方法实现算法,其时间复杂度可以达到O(VE^2),而Push-relabel方法的算法实现(relabel-to-front)的复杂度可以达到O(V^3).先说明一下基本概念:c(原创 2008-11-15 16:15:00 · 1686 阅读 · 0 评论 -
线性规划 单纯形算法
线性规划 单纯形算法根据单联通区域求极值的想法得来的算法思想,故而叫做simplex algorithm。暂且将写下的程序贴出,做个备份。具体算法分析待看完证明后贴出。此算法实现完全是对《算法导论》上算法框架的实现。注:要使用g++编译器,vc要将变量定义做一些更改。#include #include #include #include #include #include using namesp原创 2008-11-08 00:16:00 · 1475 阅读 · 1 评论 -
随机算法 MillerRabin素数测试是3/4正确的蒙特卡洛算法
随机算法 MillerRabin素数测试是3/4正确的蒙特卡洛算法为什么MillerRabin素数测试优于简单利用费马定理的测试呢?当我们利用费马小定理测试一个数是否是素数的时候,如果返回假,那么100%确定这个数是合数,但是如果返回值是真,有多少出错的可能呢。如果a^(n-1)mod n =1并且n是一个合数那么这个a就叫做n的一个假见证,我们做个这样的一个统计,在小于1000的奇合数中有多原创 2008-11-02 21:09:00 · 1815 阅读 · 0 评论 -
随机算法 素数测试
素数测试费马定理进行素数测试如果n不能整除a则有a^(n-1) mod n = 1,通过判断费马定理的模等式是否成立就可以判断一个数是不是合数(显然,如果一个数是合数那么等式一定不成立)但是,如果等式成立,n还是有可能是合数(伪素数:1387等)。MillerRabin素数测试基于:1,a^(n-1) mod n = 1,2,x^2 mod n = 1;通过以下几个手段达到更好的测试效果:原创 2008-10-29 22:34:00 · 2053 阅读 · 0 评论 -
随机算法 之模幂函数
在随机素数测试算法中要用到模幂运算,在O(lgn)的时间内产生模幂结果是非常有用的。在诸如RSA等算法中都要用到求a^n mod p的运算,例如费马小定理(a^(n-1) mod n = 1,p是a的非素数因子)及rsa算法用到的费马定理的推广(a^(y(n))mod n = 1,y(n)为n的欧拉函数)等等都需要用到模幂运算,那么怎么能快速的到模幂运算结果其实原理很简单,这是我用english写原创 2008-10-24 13:27:00 · 1480 阅读 · 0 评论 -
随机算法 之随机数的产生
随机算法 之随机数的产生编写随机算法程序的基础就是编写一个随机数产生器,实践过程中发现很多同学在使用c++的随机数产生函数的时候都犯一个相同的错误——srand多次使用,我想那是因为对随机数产生过程不够了解造成的产生随机数常用的有两种方法:线性同余: x(0) = d x(n) = (b*x(n-1)+c)mod m 这里有一个经验公式:x(n) = (314159269x(n-1)+4538原创 2008-10-24 13:03:00 · 1721 阅读 · 0 评论 -
pku 3378(树状数组实现)
pku 3378树状数组解法:看到题目,我们首先应该想到的是求:在一个数组里前n-1个数有多少个比第n个数小。对于这个问题,我先将这个数组离散化---就是得到第n个数是第几大(或小)的数,然后建立树状数组,s[i]为第i大的数前面的所有的数的个数(包括第i大的数),这样说或许不好理解,但是,我解释一下以下的语句就简单多了:(前提是你已经对树状数组有所了解) for(int i=原创 2007-09-13 22:06:00 · 2133 阅读 · 1 评论 -
POJ 1080 LCS扩展!
#include#includeusing namespace std;#define A 0#define C 1#define G 2#define T 3#define MINUS 4#define BUFSIZE 110char p[BUFSIZE],q[BUFSIZE];int rule[5][5] = { {5,-1原创 2007-06-14 23:48:00 · 2154 阅读 · 3 评论 -
匈牙利算法!!!
匈牙利算法求最大匹配的一种显而易见的算法是:先找出全部匹配,然后保留匹配数最多的。但是这个算法的复杂度为边数的指数级函数。因此,需要寻求一种更加高效的算法。增广路的定义(也称增广轨或交错轨):若P是图G中一条连通两个未匹配顶点的路径,并且属M的边和不属M的边(即已匹配和待匹配的边)在P上交替出现,则称P为相对于M的一条增广路径。由增广路的定义可以推出下述转载 2007-08-21 19:55:00 · 891 阅读 · 0 评论 -
求最长公共子序列的空间优化。
我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j].这样,空间复杂度是o(M*N),对此,我们可以做一下优化:注意到,在求c(i,j)时,只用到了c(i-1,j)和c(i,j-1),所以可以用滚动数组来优化,具体实现又极其简单: 对于s1[原创 2007-08-20 18:47:00 · 2686 阅读 · 0 评论 -
关于广度优先搜索的判重
当然如果当前搜索到的状态前面已经扩展过了就不需要加入队列了,首先要考虑好当前状态是什么,保险的方法是建一个struct,如果扩展状态没有扩展过,当然需要扩展了,不能盲目的判重,以至于漏掉状态。常用的判重访法就是建一个hash表了,就是要在线性时间内判断一个状态是否扩展过。即使不能进行判重,也一定有条件可以使扩展状态逐渐减少,最终达到目标状态,或者达到目标状态是即推出等等条件,反正是原创 2007-07-08 09:30:00 · 1166 阅读 · 1 评论 -
学习卡尔曼滤波
偶然机会想学学(最起码知道一下)卡尔曼滤波,以前学人工智能课程学过滤波算法,但是老师只是提了一下有这个东西,一直不知道如何用它来解决问题。1,参考资料:http://www.cs.unc.edu/~welch/kalman/里面有一个"An Introduction to the Kalman Filter",这个也有中文版,但是需要翻强,很多代理道行不够翻不过去,用这个http://原创 2009-12-23 20:44:00 · 3905 阅读 · 0 评论