摘要:
32.1 平衡三进制 PKU JudgeOnline, 1702, Eva'sBalance是一个平衡三进制问题的实例。将一个某进制数转换为平衡三进制数的方法为:先转化为用0,1,2表示的3进制,然后通过“借位”转换。也即: 若对应的系数为2,则变为-1,高一位+1。 若对应的系数为3,则变为0,高一位+1。 为0或1时不变32.1.1实例PKU JudgeOnline, 1702, Eva's Balance.32.1.2问题描述有一个天平和一套重量为3^n的砝码,每种砝码只有一个。给定一个重量,给出维持天平平衡的砝码和重物的放置方法。32.1.3输入3952032.1.4输 阅读全文
随笔分类 - 实用算法实践
实用算法实现-第 31 篇 博弈游戏
2012-02-14 22:18 by myjava2, 246 阅读, 收藏,
摘要:
31.1 Bash博弈只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。很容易想到当n%(m+1)<>0时,先取必胜,第一次先拿走n%(m+1),以后每个回合到保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。31.2 Wythoff博弈有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3 阅读全文
实用算法实现-第 30 篇 组合数学
2012-02-08 23:38 by myjava2, 173 阅读, 收藏,
摘要:
30.1 Ctalan数PKU JudgeOnline, 1095, Trees Made to Order.30.2 Fibonacci数Fibonacci数列的定义如下:f(n) = f(n - 1) + f(n - 2) (n >= 3)f(1) = 1, f(2) = 2f(0)可定义为1。用归纳法可以证明性质:f(n + m) = f(m - 1)f(n + 1) + f(m - 2)f(n) (m>= 2)利用这条性质,我们可以将比较大的n的Fibonacci数转化成比较小的Fibonacci数,从而使计算起来更为方便。这里有一个问题:Fibonacii数列 Fn (m 阅读全文
实用算法实现-第 29 篇 计算几何学
2012-02-07 19:39 by myjava2, 245 阅读, 收藏,
摘要:
29.1 最近点对“最近”是指通常意义上的欧几里德距离。《算法导论》中对这个问题进行了介绍。[i]问对于经典的分治法求最近点对有深入的介绍和详尽的伪代码。29.1.1实例PKU JudgeOnline, 3714, Raid.29.1.2问题描述给定n个岗位和n个战士的坐标(0 ≤ X ≤1000000000, 0 ≤ Y ≤ 1000000000)。问这些战士当中,离某个岗位最近的距离是多少?29.1.3输入2400011011222332334000000000000000 029.1.4输出1.4140.00029.1.5分析这也是一个最近距离的问题,只不过是两个集合中的元素的最近距离的 阅读全文
实用算法实现-第 28 篇 素数判别
2012-02-04 19:35 by myjava2, 344 阅读, 收藏,
摘要:
28.1 朴素的素数判别bool isPrime(__long n)
{ //简单的判断素数的确定性算法 __long i; if(n == 2|| n == 3) return true; if(n % 2 ==0) return false; for(i = 3;i < (__long)sqrt((double)n) + 1; i += 2){ if(n %i == 0) returnfalse; } return true;
}
int ... 阅读全文
实用算法实现-第 27 篇 中国余数定理
2012-01-24 21:49 by myjava2, 329 阅读, 收藏,
摘要:
27.1 中国余数定理定理:对任意n > 1,如果gcd(a, n) = 1,则方程a • x ≡ 1(mod n)对模n有唯一解,否则方程无解。若方程有解,x可以表示为(a^-1) mod n,x可以由欧几里德算法的扩广形式求出。设n1, n2, ..., nk两两互质,n = n1• n2 • ... • nk定义:mi = n1• n2 • ... • ni-1 • ni+1 • ... • nk定义:ci = mi • (mi^-1 mod ni)定义:a ≡ (a1•c1 + a2• c2 + ...+ak•ck) (mod n)可以证明:a ≡ ai (mod ni)证明如下 阅读全文
实用算法实现-第 26 篇 模运算
2012-01-24 21:42 by myjava2, 322 阅读, 收藏,
摘要:
26.1 模运算的基本性质《算法导论》中提到,模加法和模乘法是两个有限可交换群。由于模运算的基本性质,故此可以对模乘运算进行分治。26.2 实例PKU JudgeOnline, 1811, Prime Test.PKU JudgeOnline, 3070, Fibonacci.本文章欢迎转载,请保留原始博客链接http://blog.csdn.net/fsdev/article待续... 阅读全文
实用算法实现-第 25 篇 最大公约数
2012-01-24 21:42 by myjava2, 189 阅读, 收藏,
摘要:
最大公约数有经典算法Euclid算法可以求出。而对于正整数a、b,若将它们的最大公约数表示为gcd(a, b),最小公倍数表示为lcm(a, b),那么有公式:a • b = gcd(a, b) • lcm(a, b)。由这个公式,可以求得两个数的最小公倍数。25.1 Euclid算法int Euclid(int a, intb)
{
/*
欧几里德算法
GCD递归定理:
对任意非负证书a和任意正整数b
gcd(a, b) = gcd(b, a mod b)
*/ if(b == 0){ returna; }else{ returnEuc... 阅读全文
实用算法实现-第 24 篇 高精度整数运算
2012-01-15 23:24 by myjava2, 260 阅读, 收藏,
摘要:
24.1 高精度整数加法24.1.1实例PKU JudgeOnline, 1503, Integer Inquiry.24.1.2问题描述给定一组超长的正整数(100位),求出它们的和。24.1.3输入123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890024.1.4输出37037036703703703670370370367024.1.5分析写一个高精度的加法就可以了。这个题目的测试比较弱,或者说我曾经写的程序的错误很难通过这个题目的测试找出。因为在调试PKU J 阅读全文
实用算法实现-第 23 篇 最大流
2012-01-14 23:16 by myjava2, 366 阅读, 收藏,
摘要:
23.1 Ford-Fullkerson方法使用BFS来实现Ford-Fullkerson方法中的找增广路径的算法称为Edmods-Karp算法。Edmods-Karp算法是最短增广路算法,因为实用BFS找到的增广路径是所有可能的增广路径中最短的路径。它的复杂度是O(VE2),其中V是结点数,E是有向边数。如果用使用DFS代替BFS,则Ford-Fullkerson方法退化成一般增广路算法。其复杂度是O(E| f* |)。其中f*是算法找出的最大流。23.2 最大流的Edmods-Karp算法 23.2.1实例PKU JudgeOnline, 1273, D 阅读全文
实用算法实践-第 22 篇 字符串匹配
2012-01-10 22:53 by myjava2, 139 阅读, 收藏,
摘要:
22.1 Knuth-Morris-Pratt算法22.1.1实例PKU JudgeOnline, 3461, Oulipo.22.1.2问题描述求字符串在另外一个字符串中出现了几次。22.1.3输入3BAPCBAPCAZAAZAZAZAVERDIAVERDXIVYERDIAN22.1.4输出13022.1.5分析标准的KMP算法解决的问题。将KMP的伪代码一翻译就出来了。22.1.6程序#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h> 阅读全文
实用算法实现-第 21 篇 每对顶点间的最短路径
2012-01-09 22:28 by myjava2, 324 阅读, 收藏,
摘要:
21.1 每对顶点间最短路径与矩阵乘法 考虑矩阵乘法D*D,有:d’’(i, j) = ∑(d’ (i, k) * d’ (k, j)) 考虑有向图每对顶点间的距离邻接矩阵。w(i, j)为由i点都j点的路径距离。故此有矩阵W的i行向量为i到点集合{j, 1≤j≤n}的距离。而矩阵W的j列向量为点集合{i, 1≤i≤n}到j的距离。 要求最短路径,可以先考虑某一个点i到j的较短路径的求法。由i点到j点,可以通过点集合{k, 1≤k≤n}中任意一点作为中间结点。i通过这些中间点到达j的最短路径就是一条较短的路径。故此i到j的较短路径长度为: W’’(i, j) = min(w’ (i, k) + 阅读全文
实用算法实现-第 20 篇 单源最短路径
2011-11-03 23:22 by myjava2, 229 阅读, 收藏,
摘要:
20.1 Dijktra算法Dijktra算法适用于有向图上带权的单源最短路径,但是要求所有边的权值非负。所以它一方面比Ford性能好,一方面又没有Ford算法的通用性。对比Dijktra算法和Prim算法,可以发现两者的相似之处。20.1.1 实例PKU JudgeOnline, 3268, Silver Cow Party.20.1.2 问题描述一只母牛从N块田中的任一块(1≤N≤1000)去参加盛大的母牛聚会,这个聚会被安排在X号田(1≤X ≤N)。一共有M(1 ≤ M ≤ 100,000)条单行道分别连接着两块田,且通过路i需要花Ti(1≤Ti≤100)的时间。每头母牛必需参加宴会并且 阅读全文
实用算法实现-第 19 第 最小生成树
2011-11-02 23:45 by myjava2, 211 阅读, 收藏,
摘要:
19.1 Prim算法《算法导论》中,Prim算法的伪代码如下:MST-PRIM(G, w, r)1 for each u ∈ V[G]2 do key[u] ← NIL3 ∏[u] ← NIL4 key [r] ← 05 Q ← V[G]6 while Q ≠ Ф7 do u ← EXTRACT-MIN(Q)8 for each v ∈ Adj[u]9 do if v ∈ Q and w (u, v) < key[v]10 then [v] ← u11 key[v] ← w(u, v)其中,key[u]是所有将u与树某一顶点连接的边中的最小权值。EXTRACT-MIN(Q)是找出连接V 阅读全文
实用算法实现-第 18 欧拉回路
2011-10-26 23:20 by myjava2, 846 阅读, 收藏,
摘要:
18.1 欧拉回路存在性的判断欧拉回路问题可以分为无向图中的欧拉回路和欧拉通路,有向图中的欧拉回路和欧拉通路。这几个问题大抵相像。有向欧拉回路有:定理:假设有像多重图D有性质:当忽略有向边上的方向时,得到的图是连通的,那么D有有向欧拉回路当且仅当D的每个顶点的入度和出度相等。类似的,对有向欧拉通路有:定理:D有有向欧拉通路,当且仅当除两个不同顶点B和C之外,D的其它顶点的入度和出度相等,且B的出度比入度大1,C的入度比出度大1。在这种情况下,有向欧拉通路自B出发,至C终止。由上面的定理可以知道,如果要判断一个有向图的欧拉回路是否存在,需要先判断连通性,再判断出度入度。对于无向图,判断方法类似。 阅读全文
实用算法实现-第 17 篇 强连通分支
2011-10-25 23:38 by myjava2, 369 阅读, 收藏,
摘要:
求强连通分量的著名算法:Kosaraju算法,Gabow算法和Tarjan算法。其中Kosaraju算法要对原图和逆图都进行一次DFS,而另外两种算法只要进行一次DFS即可。[i]文是介绍Gabow算法的论文。17.1 Kosaraju算法Kosaraju算法虽然要进行两次DFS,但是复杂度仍然是O(V+E),而且比较容易理解。17.1.1实例PKU JudgeOnline, 2186, Popular Cows. 17.1.2问题描述有一群牛,总数为N。给出牛之间的M个仰慕关系,该关系可以传递,比如:1仰慕2,2仰慕3,那么1也仰慕3,如果一头牛被所有的牛都仰慕,那么它将是最受欢迎的牛,求出 阅读全文
实用算法实现-第 16 篇 拓扑排序
2011-10-24 23:19 by myjava2, 163 阅读, 收藏,
摘要:
16.1 拓扑排序拓扑排序的本质是由某集合上的一个偏序得到该集合上的一个全序。16.1.1实例PKU JudgeOnline, 1094, Sorting It All Out. 16.1.2问题描述给出类似A<B的一系列关系,判断输入第几个关系的时候顺序排定,或者出现环,或者所有输入完成后仍没出现环或者排定顺序。注意:当拓扑排序不唯一(当然也就不确定)的时候 还要判断是否有环。注意:如果前几条不等式可以确定一个序列,那么后面的的都要被忽略,即使加上它们会发生矛盾。16.1.3输入46A<BA<CB<CC<DB<DA<B32A<BB<A26 阅读全文
实用算法实现-第 15 篇 对抗搜索
2011-10-23 23:39 by myjava2, 601 阅读, 收藏,
摘要:
《人工智能,一种现代方法》对于对抗搜索的介绍非常好。15.1 极小值极大值策略极大值极小值策略是一种最优策略。当对手不犯错误时,最优策略能够导致至少不比其它任何其它策略差的结果。需要注意的是,最优策略针对的是最优化对手:如果使用极大值极小值策略对付非最优化对手,可能没有使用其它策略好,但是使用那些策略对付最优化对手必定要比极大值极小值策略差。极小值极大值策略是指存在两个最优化的博弈对手MIN和MAX,MIN的目的是使得value最小,而MAX则是使得value最大。由于两个对手都不会犯错误,即采用最优策略,故此有如下公式:不难发现使用极小值极大值策略实际完成的是对策略空间的一种深度优先搜索。1 阅读全文
实用算法实现-第 14 篇 启发式搜索
2011-10-23 00:15 by myjava2, 315 阅读, 收藏,
摘要:
14.1 A*搜索A*(A star)算法是一种很好的树搜索策略,在许多人工智能的书籍中有所介绍。比如《人工智能,一种现代方法》和《人工智能,复杂问题求解的结构和策略》。[i]文介绍到,A*算法使用估价函数F(N)来估算从初始状态S到当前状态N,再到目标状态T需要的最小步数。有公式:F(N) = G(N) + H(N)其中,G(N)是起始状态S到当前状态的实际代价G(N),它比最佳路径的代价G*(N)大。H(N)是从当前状态到目标状态T的实际代价的估算值H*(N),它比实际代价H(N)大。对于一个起始状态到当前状态的实际路径,G(N)是已经决定的。H(N)的选择则至关重要。有两个限制:1. H 阅读全文
实用算法实现-第13篇 搜索(盲目搜索)
2011-10-22 01:17 by myjava2, 741 阅读, 收藏,
摘要:
在人工智能中,盲目搜索是相对于启发式搜索来说的。13.1 广度优先搜索《算法导论》中,广度优先(Breadth-First)搜索树的伪代码如下:BFS(G,s)1 for each vertex u ∈ V[G] - {s}2 docolor[u] ← WHITE3 d[u] ← ∞4 ∏[u] ← NIL5 color[s] ← GRAY6 d[s] ← 07 ∏[s] ← NIL8 Q ← Ф9ENQUEUE(Q, s)10while Q ≠ Ф11 do u ← head[Q]12 for each v ∈ Adj[u]13 doif color[v] = WHITE14 thencol 阅读全文
浙公网安备 33010602011771号