【数据结构和算法】
文章平均质量分 74
zwb8848happy
酷得惊动了党
展开
-
几个最短路径算法比较
几个最短路径算法比较五大最短路径算法比较July、二零一一年二月十二日。本文参考:维基百科。----------------------------------- 几个最短路径算法的比较: I、Floyd:求多源、无负权边的最短路。用矩阵记录图。时效性较差,时间复杂度O(V^3)。 Floyd-Warshall算法(Floyd-Warshall algorith转载 2011-12-28 21:52:15 · 884 阅读 · 0 评论 -
字典序问题
问题描述:在数据加密和数据压缩中常需要对特殊的字符串进行编码.给定的字母表A由26个小写英文字母组成,即A={a,b...z}.该字母表产生的长序字符串是指定字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1次.例如,a,b,ab,bc,xyz,等字符串是升序字符串.现在对字母表A产生的所有长度不超过6的升序字符串按照字典排列编码如下:对于任意长度不超过6的转载 2012-03-05 22:48:29 · 1365 阅读 · 0 评论 -
DFS 深度优先搜索
http://hi.baidu.com/gropefor/blog/item/3a00b683115b4f98f603a61f.html深度优先搜索算法需要了解深度优先遍历的执行过程,本文中利用一个栈来模拟递归实现中系统设置的工作栈,算法的伪代码描述为:(1)初始化栈(2)输出起始节点,并标记为已访问,将该节点压入栈(3)While(栈不为空)a.取得栈顶节点Top,注意不要从原创 2011-12-28 21:47:12 · 654 阅读 · 0 评论 -
数的计算
描述要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n1. 不作任何处理;2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.输入一个自然数n输出一个数,表示满足条件的数的个数样例输入6样例输出6提示样例说明:满足条件的数是6,16,26,12原创 2012-03-30 17:35:33 · 590 阅读 · 0 评论 -
深入浅出大数阶乘
大数阶乘的计算是一个有趣的话题,从中学生到大学教授,许多人都投入到这个问题的探索和研究之中,并发表了他们自己的研究成果。如果你用阶乘作关键字在google上搜索,会找到许多此类文章,另外,如果你使用google学术搜索,也能找到一些计算大数阶乘的学术论文。但这些文章和论文的深度有限,并没有给出一个高速的算法和程序。 我和许多对大数阶乘感兴趣的人一样,很早就开始编制大数阶乘的程序。从转载 2012-04-02 17:38:22 · 6484 阅读 · 0 评论 -
最大子矩阵和问题
问题:求一个M*N的矩阵的最大子矩阵和。比如在如下这个矩阵中:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 ………………【1】拥有最大和的子矩阵为:9 2-4 1-1 8其和为15。分析:我们首先想到的方法就是穷举一个矩阵的所有子矩阵,然而一个n*n的矩阵的子矩阵的个数当n原创 2012-04-02 09:50:48 · 587 阅读 · 0 评论 -
最长公共子序列
动态规划算法解LCS问题1、最长公共子序列的结构 最长公共子序列的结构有如下表示: 设序列X=1, x2, …, xm>和Y=1, y2, …, yn>的一个最长公共子序列Z=1, z2, …, zk>,则:若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列;若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列;若x原创 2012-04-01 20:53:38 · 1908 阅读 · 3 评论 -
最大子段和
问题:给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为Max{0,a[i]+a[i+1]+…+a[j]},1例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和原创 2012-04-02 09:12:52 · 630 阅读 · 0 评论 -
第k回文数
问题:给一个数k,给出第k个回文数分析:一位数9个,二位数9个;三位数90个,四位数90个;五位数900个,六位数900个;。。。。。给出代码:#include void calPalin(int iNum);int main(){ int iNum; while (scanf("%d",&iNum)!=EOF) { if (i原创 2012-04-08 22:36:34 · 2153 阅读 · 0 评论 -
大数阶乘
#include #include #include void Factorial(int n);int main(){ int n; clock_t start,finish; double duration; while (printf("\nInput a number: "),scanf("%d",&n)!=EOF) { start=clock(); F原创 2012-04-02 17:12:04 · 517 阅读 · 0 评论 -
散列表(HashTable)探秘 --上
处理实际问题的一般数学方法是,首先提炼出问题的本质元素,然后把它看作一个比现实无限宽广的可能性系统,这个系统中的实质关系可以通过一般化的推理来论证理解,并可归纳成一般公式,而这个一般公式适用于任何特殊情况。 ——R.A. Fisher 在一个解决方案的复杂性之中,理论或者概念的部分通常只占有限的一小部分转载 2012-04-29 08:34:02 · 768 阅读 · 0 评论 -
散列表(HashTable)探秘 --中
不用链接法,还有别的方法能处理碰撞吗?扪心自问,我不敢问这个问题。链接法如此的自然、直接,以至于我不敢相信还有别的(甚至是更好的)方法。推动科技进步的人,永远是那些敢于问出比外行更天真、更外行的问题,并且善于运用丰富的想象力找到新的可能性,而且有能力运用科学的方法实践的人。 如果可以不用链表,把节省下来的链表的指针所占用的空间用作空槽,就可以减少碰撞的机会,提高查找速度。使用开放寻址转载 2012-04-29 08:51:34 · 539 阅读 · 0 评论 -
散列表(HashTable)探秘 --下
【澈丹,我想要个钻戒。】【小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱。】 ——自扯自蛋 无论开发一个程序还是谈一场恋爱,都差不多要经历这么4个阶段: 1)从零开始。没有束缚的轻松感。似乎拥有无限的可能性,也有相当多的不确定,兴奋、紧张和恐惧。 2)从无到有。无从下手的感觉。一步一坎,进展缓慢。走转载 2012-04-29 09:05:54 · 583 阅读 · 0 评论 -
乘积最大
【题目描述】今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先 生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活 动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样 一道题目:设有一个长度N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。原创 2012-04-20 09:12:45 · 9127 阅读 · 0 评论 -
最小代价树
题目:描述以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和。例如:((4+1)+ (2+3))=((5)+(5))=10。除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加,得到:5+5+10=20,那么数20称为此数列的一个代价,若得到另一种算法:(4+((1+2原创 2012-04-20 09:07:20 · 2787 阅读 · 0 评论 -
统计数字问题
在王晓东编著的《算法设计与实验题解》中看到的这个问题,问题描述如下:一本书的页码从自然数1开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如第6页用6表示而不是06或006。数字统计问题要求对给定书的总页码,计算出书的全部页码中分别用到多少次数字0,1,2,3,.....9。例如:输入11,输出:1,4,1,1,1,1,1,1,1,1在h原创 2012-03-01 22:20:56 · 687 阅读 · 0 评论 -
最多约数问题
问题描述: 正整数x的约数是能整除x的正整数。正整数x 的约数个数记为div(x)。例如,1,2,5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a和b之间约数个数最多的数x。 问题简化: 对于给定的2个正整数a≤b,编程计算a 和 b 之间约数个数最多的数。来源:《计算机算法设计与分析(第三版)》作者:王晓东,出版社:电子工业出原创 2012-03-05 22:36:07 · 2031 阅读 · 0 评论 -
筛选法求素数
分析:素数筛法是这样的: 1.开一个大的bool型数组prime[],大小就是n+1就可以了.先把所有的下标为奇数的标为true,下标为偶数的标为false. 2.然后: for( i=3; i { if(prime) for( j=i+i; j } 3.最后输出bool数组中的值为tru原创 2012-03-05 21:57:22 · 485 阅读 · 0 评论 -
搜索算法-讲解[八皇后问题]
算法分析深度优先搜索法。首先我们来想象一只老鼠,在一座不见天日的迷宫内,老鼠在入口处进去,要从出口出来。那老鼠会怎么走?当然是这样的:老鼠如果遇到直路,就一直往前走,如果遇到分叉路口,就任意选 择其中的一个继续往下走,如果遇到死胡同,就退回到最近的一个分叉路口,选择另一条道路再走下去,如果 遇到了出口,老鼠的旅途就算结束了。深度优先搜索法的基本原则就是这样:按照某种条件往前试探搜索,如转载 2011-12-28 21:49:57 · 4837 阅读 · 1 评论 -
经典算法研究系列:二之续、彻底理解Dijkstra算法
经典算法研究系列:二之续、彻底理解Dijkstra算法 经典算法研究系列:二之续、彻底理解Dijkstra算法 作者:July 二零一一年二月十三日。参考代码:introduction to algorithms,Second Edition。---------------------------------------了解什么是Dijkstra 算法,请参转载 2011-12-28 21:53:39 · 596 阅读 · 0 评论 -
无向网最小生成树 prim算法 和 kruskal算法
prim算法:1. 从无向网中的任一点开始,例如V0,将其放入集合V2. 寻找离集合V中的点距离最近的点Vn,加入集合。3. 重复2,直到V中包含无向网中的所有点伪码:无向网中有n个点V0加入集合V当前点 = V0初始化到各点的距离为[V0,Vi]即V0到各点的距离。while(--n) //每次加入一个点{ 寻找离当前点最近的且未加入集合的点转载 2011-12-28 21:45:44 · 943 阅读 · 0 评论 -
【整理】约瑟夫问题的数学方法
【整理】约瑟夫问题的数学方法 .2009-05-24 00:31 2074人阅读 评论(0) 收藏 举报 以前就知道约瑟夫问题是模拟,今天我才发现一些约瑟夫问题可以使用数学解法得出!真是强悍啊!约瑟夫问题真是博大精深!当然报数长度不定的应该只有模拟了吧,能用数学做的都是简化过的约瑟夫问题。下面整理如下:1.问题描述:n个人(编号1~n),从1开始报数,报到m的退出,剩下的人继续从1转载 2012-01-05 21:40:10 · 1026 阅读 · 0 评论 -
背包九讲
P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便转载 2012-01-05 21:53:53 · 402 阅读 · 0 评论 -
计算星期几的公式
如何计算某一天是星期几?—— 蔡勒(Zeller)公式 历史上的某一天是星期几?未来的某一天是星期几?关于这个问题,有很多计算公式(两个通用计算公式和一些分段计算公式),其中最著名的是蔡勒(Zeller)公式。即w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,转载 2012-02-22 15:30:24 · 11311 阅读 · 0 评论 -
整数的分划问题
[整数的分划问题] 对于一个正整数M的分划就是把M写成一系列正整数之和的表达式。例如,对于正整 数M=6,它可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1 注意,分划与顺序无关,例如5+1和1+5是同一种分划。另外原创 2012-03-01 22:45:48 · 823 阅读 · 0 评论 -
全排列
程序如下:#include #include char temp,s[10];int len;void fun(int k);int main(){ while (scanf("%s",s)!=EOF) { len=strlen(s); fun(0); } return 0;}void fun(int k){ int i; if (k==原创 2012-03-03 22:32:20 · 788 阅读 · 0 评论 -
蛇形填数问题
先给代码:#include #include int a[20][20];void Translate(int n);void Output(int n);int main(){ int n; while (printf("Please Input a Num: "),scanf("%d",&n)!=EOF) { Translate(原创 2012-03-02 19:49:07 · 512 阅读 · 0 评论 -
n的阶乘
对于比较小的n,求其阶乘的时候可以用递归解决。但是如果n很大的时候,比如1000,那么n!肯定超出整形数据所能表示的范围。因此必须采用其它方法解决,通常解决大数运算数据超出范围的问题时采用数组去模拟。其实求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间临时变量。代码如下:#include#define MAX 1000u原创 2012-03-02 20:24:17 · 615 阅读 · 0 评论 -
整数的分划问题(续)---非递归法
上一篇讨论的是整数划分问题递归方法,下面来讨论下非递归方法:一般情况下,遇到递归问题,若能直接求得递推式,则可以很容易用数组模拟来实现递归,根据已经得出的递归关系,可以设置一个二维数组S[][]来存储数据:关系如下:for(i=1;in;i++){ S[i][1]=1; S[1][i]=1;}for(i=2;in;i++){ for转载 2012-03-02 22:45:30 · 880 阅读 · 0 评论 -
字典序全排列
字典序法中,对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。字典序算法如下:设P是1~n的一个全排列:p=p1p2......pn=p1p2......pj-1pjp原创 2012-03-04 16:51:25 · 12151 阅读 · 2 评论 -
prim算法
prim算法是基于顶点来实现最小生成树的,我们假设使用邻接矩阵来存储图的,在prim算法实现的过程中,我们需要知道以下两类信息1.集合T1内各顶点到集合T2中个顶点的权值最小边的权值 //其中T2集合是表示这些集合中的点已经是最小生成树中的点了2.集合T1内个顶点距离集合T2中哪个顶点的距离最小为此,我们用两个数组来实现上面两类信息lowcost[maxn]转载 2012-05-16 21:22:59 · 609 阅读 · 0 评论