文章分类 -  算法与数据结构

学习,分析,总结算法规律
中文数字转阿拉伯数字
摘要:自己写得一个中文数字转阿拉伯数字代码,模拟写的,如果有badcase欢迎大家拍砖。package org.x.cloud.rewrite;import java.util.ArrayList;import java.util.HashMap;import java.util.regex.Matcher;import java.util.regex.Pattern;class DigitalUtil { private String regex_al = null; private Pattern pattern_al = null; private String regex_... 阅读全文

posted @ 2013-12-03 17:22 _Clarence 阅读(243) 评论(0) 推荐(0)

随手写了几个排序
摘要:花了差不多一个小时,堆排还有点不好使,有待改正;#include <iostream>#include <stdlib.h>#include <time.h>const int maxn = 20;using namespace std;int A[maxn];void insertSort() //直接插入排序;{ int tmp,i,j; for (i = 1;i < maxn; i++ ) { tmp = A[i]; for (j = i-1 ; j >= 0 && A[j] > tmp; j--) { i... 阅读全文

posted @ 2012-05-16 21:20 _Clarence 阅读(109) 评论(0) 推荐(0)

计算一年中的一天是星期几
摘要:#include <stdio.h>char * name[]= {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};int main(){ int d,m,y,a; printf("Day: "); scanf("%d",&d); printf("Month: "); scanf(& 阅读全文

posted @ 2012-03-24 14:15 _Clarence 阅读(194) 评论(0) 推荐(0)

64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
摘要:在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法。前者可以在 的时间内以很高的成功概率判断一个整数是否是素数。后者可以在最优 的时间内完成合数的因数分解。这两种算法相对于试除法都显得比较复杂。本文试图对这两者进行简单的阐述,说明它们在32位计算机上限制在64位以内的条件下的实现中的细节。下文提到的所有字母均表示整数。一、Rabin-Miller强伪素数测试Rabin-Miller强伪素数测试的基本思想来源于如下的Fermat小定理:如果p是一个素数,则... 阅读全文

posted @ 2011-08-27 13:16 _Clarence

用母函数的思路解释母函数的代码
摘要:该文章建立在你已经看过母函数的相关数学知识的基础上,如果没有看过,建议看一下 hdu 论坛的母函数课件,传送门:http://acm.hdu.edu.cn/forum/read.php?tid=3853用一个最简单的例子说明代码:硬币面值有1元、5元、10元、25元、50元,一共5种,对于一个钱数 money,可以有多少中兑现方法?很容易地构造母函数G(x) = (x^0 + x^1 + x^2 + …) * (x^0 + x^5 + x^10 + …) * (x^0 + x^10 + x^20 + …)* (x^0 + x^25 + x^50 + x^75 + …) * (x^0 + x^5 阅读全文

posted @ 2011-08-26 14:40 _Clarence 阅读(279) 评论(0) 推荐(0)

RMQ与LCA
摘要:RMQ英文是Range Maximum(Minimum) Query,是用来求取某个区间的最大值最小值,通常用在查询次数比较大的区间最值问题中。RMQ的原理是动态规划,利用了倍增的思想。我们用A[1...N]表示一组数,[Li,Ri]表示题目涉及到的查询区间。设F[i,j]表示从A[i]到A[i + (2^j) - 1]这个范围的最大值,也就是以A[i]为起点的连续2^j个数的最大值。由于元素个数是2^j,可以均分为两部分,每部分有2^j-1个数。整个区间的最大值肯定是前半部分的最大值和后半部分最大值的较大者,满足动态规划的最优子结构。则动归方程为:f[i, j] = max(f[i, j-. 阅读全文

posted @ 2011-08-17 21:27 _Clarence 阅读(285) 评论(0) 推荐(0)

已知数的前序和中序遍历,求后序遍历和层序遍历的序列
摘要:树的存储结构定为链式存储结构,首先需要建树buildTree(),然后用递归遍历PostTraverse()产生后序遍历,借用队列实现层序遍历:实现代码:#include <iostream>#include <string>#include <queue>using namespace std;struct TreeNode{ char val; TreeNode *left,*right;};TreeNode * bulidTree(string pre,string in){ TreeNode * root =NULL; if (pre.length( 阅读全文

posted @ 2011-08-07 10:52 _Clarence 阅读(439) 评论(0) 推荐(0)

最长不降子序列
摘要:这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。一.问题描述 设有由n个不相同的整数组成的数列,记为: a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j) 例如3,18,7,14,10,12,23,41,16,24。 若存在i1<i2<i3< … < ie 且有a(i1)<a(i2)< … <a(ie)则称为长度为e的不下降序列。如上例中3,18 阅读全文

posted @ 2011-08-05 09:52 _Clarence 阅读(886) 评论(0) 推荐(0)

素数测试+大数的因素分解 的概率算法
摘要:素数在密码届被广泛使用。如何判断一个素是素数,迄今为止最有效的方法是筛数法,做个表(打表法)即素数的倍数一定是合数。筛选法的效率很高,但是遇到大素数就无能为力了。米勒罗宾算法是一个相当著名的判断是否是素数的算法,能够很大概率的判断一个数是否是素数(接近100%,在一定范围内能达到100%)。在工程方面被广泛应用。米勒罗宾算法的核心是课上提到的费马小定理:即如果一个数n 它的 a^(n-1)%n !=1 (0<a<n) 则它一定是合数。如果 a^(n-1)%n ==1 (0<a<n) 则它可能是合数可能是素数。概率算法的概率就在这个 a上体现。/*1 随机取一个 a2 如 阅读全文

posted @ 2011-05-06 19:53 _Clarence 阅读(875) 评论(1) 推荐(0)

无穷下降法·数的按位异或与随机博弈(1)
摘要:无穷下降法是著名的业余数学家费马提出的,也正是因为这个方法他才敢在书页边上声称自己已经找到了一个巧妙的方法证明费马猜想(x^n+y^n=z^n在n>2时没有正整数解,x^y表示x的y次方)。意外的是这个方法并没有想象中的那样神奇,它仅仅可以证明对于某些特殊的n才能成立(譬如说4),思路是:假设存在一组解(x0,y0,z0),那么由这一组解可以得到一组新的解(x1,y1,z1),并且满足z0>z1,这个过程可以重复进行,然而这是不可能的,这样必然使得zi“下降”到0,所以原方程没有正整数解。这个方法应该和数学归纳法齐名的,然而它太类似反证法了:上述证明可以写成假设一组解(x0,y0, 阅读全文

posted @ 2011-05-06 19:47 _Clarence 阅读(896) 评论(0) 推荐(0)

寻找和最大的最长子串
摘要:问题:给你一个整型数组,其中的元素有正有负也有0,要求你找到一个连续的子串,子串的所有元素之和是所有的连续子串中最大的,而且是非负的。(应该讲清楚了吧?^_^)解决方法:最简单而又最高效的方法应该就是《编程珠玑》上介绍的扫描法了吧。其基本思想是假设以【0~(i-1)】为下标区间的子串中的最大子向量的元素之和,以及以下标 i-1 为截止元素的最大子向量之和已经求出,则当扫描到下标为 i 的元素时,这两个最大和应该做如何改变?具体操作可以这样:通过一个变量保存遍历到当前位置为止所找到的最大连续子串的元素之和,假设为max通过另一个变量temp用来保存以当前位置上的元素作为最后一个元素的连续子串的元 阅读全文

posted @ 2011-05-06 19:36 _Clarence 阅读(409) 评论(0) 推荐(0)

Bash Game
摘要:(一)巴什博弈(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。很容易想到当n%(m+1)=0时,先取必胜,第一次先拿走n%(m+1),以后每个回合到保持两人拿走的物品总和为m+1即可。这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个,谁能报到100者胜。 阅读全文

posted @ 2011-05-06 19:29 _Clarence 阅读(177) 评论(0) 推荐(0)

Wythoff Game
摘要:威佐夫博弈(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10).可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk=ak+k. 那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式: ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...,n 方括号表示取整函数)奇妙的是其中出现了黄金分割数(1+√5)/ 阅读全文

posted @ 2011-05-06 19:27 _Clarence 阅读(114) 评论(0) 推荐(0)

Nimm Game
摘要:尼姆博弈(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。对于任何奇异局势(a,b,c),都有a^b^c=0.非奇异局势(a,b,c)(a<b<c)转换为奇异局势,只需将c变为a^b,即从c中减去 c-(a^b)即可。 阅读全文

posted @ 2011-05-06 19:26 _Clarence 阅读(143) 评论(0) 推荐(0)

prim 算法
摘要:最小生成树是数据结构中图的一种重要应用,它的要求是从一个带权无向完全图中选择n-1条边并使这个图仍然连通(也即得到了一棵生成树),同时还要考虑使树的权最小。为了得到最小生成树,人们设计了很多算法,最著名的有prim算法和kruskal算法。教材中介绍了prim算法,但是讲得不够详细,理解起来比较困难,为了帮助大家更好的理解这一算法,本文对书中的内容作了进一步的细化,希望能对大家有所帮助。假设V是图中顶点的集合,E是图中边的集合,TE为最小生成树中的边的集合,则prim算法通过以下步骤可以得到最小生成树:1:初始化:U={u 0},TE={ }。此步骤设立一个只有结点u 0的结点集U和一个空的边 阅读全文

posted @ 2011-05-06 19:18 _Clarence 阅读(374) 评论(0) 推荐(0)

最大子串和----经典动态规划
摘要:假如对于子段:9 2 -16 2temp[i]表示以ai结尾的子段中的最大子段和。在已知temp[i]的情况下,求temp [i+1]的方法是:如果temp[i]>0 temp [i+1]= temp[i]+ai(继续在前一个子段上加上ai),否则temp[i+1]=ai(不加上前面的子段),也就是说状态转移方程:temp[i] = (temp[i-1]>0?temp[i-1]:0)+buf[i];int getMax(int buf[100],int n){int temp[101],max=n*(-127);memset(temp,0,4*(n+1));for(int i=1; 阅读全文

posted @ 2011-05-06 19:08 _Clarence 阅读(177) 评论(0) 推荐(0)

0-1背包 和 完全背包
摘要:0-1背包状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。优化空间复杂度后得到:for i=1..N for v=V..0 f[ 阅读全文

posted @ 2011-05-06 18:54 _Clarence 阅读(179) 评论(0) 推荐(0)

导航