
算法(数据结构)每天一题
文章平均质量分 70
NeilHappy
这个作者很懒,什么都没留下…
展开
-
动态规划之最长公共子序列------2012年12月22日,23日
今天是2012年12月22日。今天的算法练习题是最长公共子序列的长度求解。 此题初看时,感觉问题非常复杂,要求解两个序列的最长的(可以不连续)的公共子序列。但是,"将复杂的问题分解成简单的问题"是基本的程序设计思想。分治法是将一个大问题分解成多个相似的小问题,而本题采用的动态规划算法,则是将复杂的问题分解成一系列的相似的子问题。另外,将所求解的子问题的解通过数组等容器保存起原创 2012-12-22 22:41:48 · 1161 阅读 · 0 评论 -
List All Of The Subset In Another Method
Problem description:Please list all of the subsets of a known set including the empty set.Thinking: the subset's sum of a super set is (n is the number of the super set element) while a n-bit bina原创 2013-01-04 16:29:57 · 1187 阅读 · 0 评论 -
产生所有排列---字典顺序-----2013年1月23日
问题描述:以字典顺序产生所有排列。假定集合set是连续的并且按从小到大顺序排列好了的,并且有n个元素。 思路:算法的思路分成两个部分:A是递归产生以某个数字开头的排列,B是调用A来依次生成 1为第一位的所有排列,2为第一位的所有排列,....n为第一位的所有排列。 下面是A部分的详细思路: 1.以1234为例子。从右到左来寻找 (j=原创 2013-01-23 20:01:36 · 1119 阅读 · 0 评论 -
列出所有K个元素的子集-----2013年1月26日
问题描述:列出一个集合的元素个数为k的所有子集。 思路:在字典顺序列出所有子集的基础上判断元素个数就可以了,比较简单。代码如下: 1 #include 2 #define MAX 1000 3 4 int main() 5 { 6 int n=5; 7 int set[MAX]={1}; 8 int index=0; 9原创 2013-01-26 09:16:30 · 1367 阅读 · 0 评论 -
集合的所有分割方式---2013年1月28日
问题描述:分割集合成多个子集合,这几个子集合间没有交集且他们的并集是原集合。 思路:将包含n个元素的集合set的分割表示为n个数字。比如set[]={1,2,3,4},那么{1,2},{3,4}就可以表示为1122,这4个数分别表示set[0]在第一个分割集合,set[1]在第一个分割集合,set[2]在第二个分割集合,set[3]在第二个分割集合。将这个过程称为编码。原创 2013-01-28 12:58:33 · 1781 阅读 · 0 评论 -
列出所有子集-----字典顺序 2013年1月14日
问题描述:写一个程序,用字典顺序把一个集合的所有子集找出来。 此题的思路来自《C语言名题精选百则技巧篇》:字典顺序,也就是字符串比较时的顺序规则。可以采取这样的思路(以下是我根据书上的思路进行归纳再加上我自己的理解得来的步骤): 先定义n是集合的个数并且集合是已经从小到大排好顺序的{1,2,3....n}的集合。集合从{1}开始(此时下标index=原创 2013-01-14 20:32:40 · 1417 阅读 · 0 评论 -
产生所有排列---旋转法------2013年1月22日
我觉得这是一个很巧秒的算法。思路非常直接,从代码里可以很容易看出来,再单步调试查看set数组的值就可以很清楚地明白算法的过程。 代码如下: 1 #include 2 #define MAX 1000 3 4 int n=3; //the number of set element 5 int set[MAX]={1,2,3}; 6 7 //mo原创 2013-01-22 15:56:20 · 912 阅读 · 0 评论 -
整数的所有不同分割数目----2013年2月15日
问题描述:把一个正整数写成若干个正整数的和。比如4=3+1,2+2,2+1+1,1+1+1+1,再加上自己,就一共有5种分割方式。 思路:求解4的所有分割方式,实际上就是求分割中以4为最大值而且和为4的所有分割方式,可以用p[4][4]来表示。抽象出来,就是p[n][m],表示分割中以m为最大值而且和为n的所有分割方式。那么,就有以下几种情况。 1.第一步当然是n=原创 2013-02-15 09:51:21 · 1237 阅读 · 0 评论 -
整数的所有不同分割数目--非递归算法
递归算法见:整数的所有不同分割数目--递归算法 思路:非递归与递归的思维顺序是互逆的,所以很容易写出以下代码。 1 #include 2 #define MAX 1000 3 4 int p[MAX][MAX]={0}; 5 6 int main() 7 { 8 int n=2; 9 int index_n,原创 2013-02-15 10:45:33 · 1315 阅读 · 0 评论 -
找出没有相邻的1的二进制数的个数---2013年2月17日
问题描述:用G(n)表示在有n位的二进制数中没有相邻的两个1的二进制数个数。比如,当n=3时,000,001,010,011,100,101,110,111这8个数中只有000,001,010,100,101这5个是没有相邻为1的,故G(3)=5。请写一个程序,输出G(n)的值。 错误的思路(考虑的不周全):采用"分治"的方法,比如n=3,每次都将处理原问题规模的二分之一,直到n原创 2013-02-17 12:45:17 · 1816 阅读 · 0 评论 -
寻找固定的和----2013年2月26日
问题描述:有两个数组x[]与y[],各有m与n个元素,而且各个元素没有依顺序排列;d是一个已知的值。请写一个程序,看看在x[]与y[]中有没有满足x[i]+y[j]=d的元素。例如,若x[]为3,7,2,4,y[]为1,5,2,3,d为9;那么x[1]+y[2]与x[3]+y[1]都合乎条件,也即都是9。 思路:x[i]+y[j]=d。那么x[i]=d-y[j]了。将x[]数组按从原创 2013-02-26 10:25:51 · 976 阅读 · 0 评论 -
寻找脚码----2013年2月24日
题目来自:《C语言精选名题百则技巧篇》 问题描述:已知一个整数数组x[],其中的元素彼此都不相同,而且也已经从小到大排列好。请用比较大小,相等的方式编写一个程序,找出给定的数组中是否有一个元素满足x[i]==i(注意:在代码中是从0开始索引的,也就是x[0]是第一个数,所以对应于代码也就是x[i]==i+1)的关系。举例而言,如果x[]={-2,-1,3,7,8},x[3]=3,因原创 2013-02-24 13:22:07 · 1364 阅读 · 0 评论 -
无限式查找-----2013年2月28日
问题描述:已知一个数组x[],元素个数有多少并不很清楚,但是数组元素已经依顺序从小到大排好,而且在数组最后添加了足够多的MAX记号;MAX表示最大的值,比数组中每一个元素都大,而且个数足够多。编写一个程序,在这个数组中找出某个给定的值。 思路:二分查找法是一个非常高效的算法,但要想使用二分查找法,必须满足2个条件:1.元素是有序的,可以从小到大排列,也可以从大到小排列。2.知道元原创 2013-02-28 11:01:29 · 1002 阅读 · 0 评论 -
列出所有子集(采用列出2进制数的方法)-------------2013年1月4日
问题描述:列出给定集合的所有子集合,包括空子集。 思路:一个集合的所有子集合的个数是个(n是集合中元素的个数),而一个位数为n的二进制也可以表示个数,所以,只要产生出了所有二进制数,就可以列出所有的子集了。在二进制的求解中,先来看这样一个例子。11111 01111+ 1--------------------111原创 2013-01-04 16:21:27 · 1382 阅读 · 0 评论 -
List All Of The Subsets
Problem description:Please list all of the subsets of a known set including the empty set.My idea: one thinking of the algorithm backtracking is to generate a tree of subset and the condition of a原创 2013-01-03 20:26:04 · 1275 阅读 · 0 评论 -
最长平台问题(递归算法)------2012年12月25日
问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3就是该数组中最长的平台。 代码如下: 1 #include 2原创 2012-12-25 14:33:09 · 1665 阅读 · 0 评论 -
最长平台问题------2012年12月24日
问题描述:已知一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在1,2,2,3,3,3,4,5,5,6中1,2.2,3.3.3,4,5.5,6都是平台。编写一个程序,接收一个数组,把这个数组中最长的平台找出来。在上面的例子中3.3.3就是该数组中最长的平台。 我的思路:用distance变量表示平台的长度,从数组t原创 2012-12-24 19:49:27 · 1529 阅读 · 0 评论 -
支配值数目-------2012年12月25日
刚才做的那道题比较简单,再做一道。 问题描述:已知f[]与g[]两个整数数组,元素都已经从小到大排列,请写一个程序,算出f[]比g[]中元素大的对数。换句话说,f[0]比g[]中多少个元素大,f[1]比g[]中多少个元素大,等等,这些值的总和就是要求的答案。举个例子,如果f[]中有1,3,5,7,9,而g[]中有2,3,4,7,8,那么答案就是12。原创 2012-12-25 15:25:37 · 1162 阅读 · 0 评论 -
两数组最短距离-------2012年12月26日
刚才那题太简单,不过瘾,再做一道题。 问题描述:已知两个元素从小到大排列的数组x[]与y[],请编写一个程序算出两个数组元素彼此之间差的绝对值中最小的一个数,此值称作数组的距离。 我的思路:关键点依然是"两个数组都从小到大排序"。那么,当x[i]==y[j]时,数组间距离为0,这肯定是最小的;当x[i]-y[j]>0时,如果i再增大,那么x[i]也会增大,那原创 2012-12-26 20:12:32 · 1567 阅读 · 0 评论 -
等值数目-------2012年12月26日
问题描述:已知两个整数数组f[]与g[],它们的元素都已经从小到大排列好,而且两个数组中的元素都各不相同。例如,f[]中有1,3,4,7,9,而g[]中有3,5,7,8,10。试编写程序算出这两个数组之间有多少组相同的元素。就这个例子而言,f[1]与g[0]是一组,f[3]与g[2]是一组。 我的思路:关键点还是"元素都已经从小到大排列好"。那么,两个数组,一起遍历就可以解决原创 2012-12-26 19:29:59 · 1322 阅读 · 0 评论 -
等值首尾和-----------2012年12月27日
问题描述:假设有一个数组x[],它有n个元素,每一个都大于零;称x[0]+x[1]+.....+x[i]为前置和,而x[j]+x[j+1]+....+x[n-1]为后置和。编写程序,求出x[]中有多少组相同的前置和与后置和。 我的思路:因为这个数组都是正数,那么,对于i越大,前置和也就越大;后置和是j越小,那么后置和越大。接下来就很简单了,当以x[i]为终点的前置和大于以x原创 2012-12-27 16:39:22 · 1073 阅读 · 0 评论 -
求质数-------2012年12月29日
昨天太忙,没有时间做一个题,先记着,明天来补。 问题描述很简单,就是求N之内的所有质数并且打印出来。 思路:求质数有很多方法,我这里用一种比较高效的方法。我一步一步地说明方法。 1.比如判断一个数num是否为质数,那么就用num去对"i(i从2开始)直到根号num"取模,如果都不能整除就说明num是质数。 2.但是这样会有原创 2012-12-29 21:34:06 · 1062 阅读 · 0 评论 -
线性筛法--------2013年1月2日
问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。 思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且原创 2013-01-02 21:00:55 · 1256 阅读 · 0 评论 -
筛法求质数------------2012年12月30日
问题描述:使用筛法求质数。有一个很神奇的筛子,可以给它一个数i,这个筛子有办法把i的所有倍数去掉。请用这个方法求出2到N之间的所有质数。要求,程序不能使用乘法和除法,只能用加或减,以求加快速度。 该问题的思路来自《C语言名题精选百则技巧篇》,很惭愧,我对这样的涉及一些数学知识的题很少有解决的办法,我需要在这一方面加强。 我把书中的思路归纳如下,并加上了我原创 2012-12-30 22:03:57 · 1172 阅读 · 0 评论 -
列出所有子集----------2013年1月3日
问题描述:列出一个集合的所有子集,包括空子集合。 我的思路:回溯法的一种思路就是生成一颗子集树,而一个集合中的元素,要么存在于子集中,要么不存在,所以这又特殊化成一颗二叉树了。每当到达二叉树的底端时,就打印一次。很容易写出如下的代码: 1 #include 2 #define MAX 1000 3 4 int n=3; //the number of t原创 2013-01-03 20:20:56 · 1098 阅读 · 0 评论 -
A Sieve Method for Prime Numbers
Problem description:Calculate the prime numbers with a sieve method.There is a magical sieve that can remove all the multiple of the number i.Please calculate the prime numbers at a range from 2 to N原创 2013-01-03 11:56:15 · 1184 阅读 · 0 评论 -
Linear Sieve Method for Prime Numbers
Problem description:When we calculate for prime numbers with a sieve method,we delete so many numbers which is not necessary repeatly.For instance,there is a number which consists of 3x7x17x23,and we原创 2013-01-03 15:55:12 · 950 阅读 · 0 评论 -
二叉树的非递归遍历-----2013年3月20日
二叉树的递归遍历算法非常漂亮和易读,但是非递归算法就没那么容易懂了,尤其是后序遍历的非递归算法。一. 前序遍历 1 void PreOrderTraverse(Node *root) 2 { 3 stack ns; 4 Node *n=root; 5 while(n!=NULL || !ns.empty()) 6 {原创 2013-03-20 17:03:43 · 1311 阅读 · 0 评论