随笔分类 -  算法(数据结构)每天一题

1 2 下一页
二叉树的非递归遍历-----2013年3月20日
摘要:二叉树的递归遍历算法非常漂亮和易读,但是非递归算法就没那么容易懂了,尤其是后序遍历的非递归算法。一. 前序遍历 1 void PreOrderTraverse(Node *root) 2 { 3 stack<Node *> ns; 4 Node *n=root; 5 while(n!=NULL || !ns.empty()) 6 { 7 if(n!=NULL) 8 { 9 print(n); 10 ns.push(n);11 n=n->pLeft;... 阅读全文
posted @ 2013-03-20 17:08 NeilHappy 阅读(330) 评论(0) 推荐(1)
无限式查找-----2013年2月28日
摘要:问题描述:已知一个数组x[],元素个数有多少并不很清楚,但是数组元素已经依顺序从小到大排好,而且在数组最后添加了足够多的MAX记号;MAX表示最大的值,比数组中每一个元素都大,而且个数足够多。编写一个程序,在这个数组中找出某个给定的值。 思路:二分查找法是一个非常高效的算法,但要想使用二分查找法,必须满足2个条件:1.元素是有序的,可以从小到大排列,也可以从大到小排列。2.知道元素集合的上界和下界。本题中元素已经从小到大排列,但是不知道数组的上界。所以,解法如下: 1.最开始,二分查找x[0]和x[1],即查找区域为[0,1)这个左闭右开区间,区间的大小是。此时start=0,e... 阅读全文
posted @ 2013-02-28 11:05 NeilHappy 阅读(259) 评论(0) 推荐(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[]数组按从小到大的顺序排序好,再用二分查找法在x[]中查找d-y[j]。这是比较简单的方法。但是这种方法比较不容易想到,因为这个问题给出的隐性思路是在x[]与y[]这两个数组中查找,而这种二分查找法是将2个查找转化成了一... 阅读全文
posted @ 2013-02-26 10:31 NeilHappy 阅读(259) 评论(0) 推荐(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,因此3就是答案。 思路:利用x[]中的元素彼此都不相同而且从小到大排列,可以用二分查找法。代码很简单。 1 #include <stdio.h> 2 #define MAX 1000 3 4 //proto 阅读全文
posted @ 2013-02-24 13:26 NeilHappy 阅读(399) 评论(4) 推荐(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=1时,就很容易可以知道有两种情况。前面是"分",然后是"合"。比如把规模为n的问题分成了p1和p2部分,而且p1和p2问题都已经解决,个数已经知道。那么,把 阅读全文
posted @ 2013-02-17 12:50 NeilHappy 阅读(563) 评论(8) 推荐(0)
整数的所有不同分割数目--非递归算法
摘要:递归算法见:整数的所有不同分割数目--递归算法 思路:非递归与递归的思维顺序是互逆的,所以很容易写出以下代码。 1 #include <stdio.h> 2 #define MAX 1000 3 4 int p[MAX][MAX]={0}; 5 6 int main() 7 { 8 int n=2; 9 int index_n,index_m;10 //initialize the p[n][1]=1;11 for(index_n=1;index_n<=n;index_n++)12 p[index_n][1]=1;13 14 ... 阅读全文
posted @ 2013-02-15 10:50 NeilHappy 阅读(430) 评论(0) 推荐(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==m,所以第一个分割肯定是n本身了。最大值为n的分割肯定只有一个,所以接下来,就要求p[n][m-1]了。归纳出来:p[n][m]=p[n][m-1]+1; 2.从第一步m-1后,n肯定是大于m了。所以,p[n][m]的分... 阅读全文
posted @ 2013-02-15 09:56 NeilHappy 阅读(1156) 评论(3) 推荐(1)
集合的所有分割方式---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]在第二个分割集合。将这个过程称为编码。 然后抓住两个要点: 1.第i个元素的编码一定小于或者等于i。约定一下,set原集合已经从小到大排列好,分割的集合也是这样排好。然后,很容易理解,第1个元素的编码肯定为1。接着,第2个元素如果在第一个分割集合中... 阅读全文
posted @ 2013-01-28 13:03 NeilHappy 阅读(1283) 评论(0) 推荐(0)
列出所有K个元素的子集-----2013年1月26日
摘要:问题描述:列出一个集合的元素个数为k的所有子集。 思路:在字典顺序列出所有子集的基础上判断元素个数就可以了,比较简单。代码如下: 1 #include <stdio.h> 2 #define MAX 1000 3 4 int main() 5 { 6 int n=5; 7 int set[MAX]={1}; 8 int index=0; 9 int count=2;10 int k=3;11 while(set[0]!=n)12 {13 if(set[index]<n) 14 { 15 ... 阅读全文
posted @ 2013-01-26 09:21 NeilHappy 阅读(437) 评论(0) 推荐(1)
产生所有排列---字典顺序-----2013年1月23日
摘要:问题描述:以字典顺序产生所有排列。假定集合set是连续的并且按从小到大顺序排列好了的,并且有n个元素。 思路:算法的思路分成两个部分:A是递归产生以某个数字开头的排列,B是调用A来依次生成 1为第一位的所有排列,2为第一位的所有排列,....n为第一位的所有排列。 下面是A部分的详细思路: 1.以1234为例子。从右到左来寻找<(j=i+1,i>0)。 2.接着再从右到左查找第一个比大的元素,然后将二者交换位置,再将到集合末尾逆序。这样就找到了1234的按字典顺序的下一个元素。 3.递归进行。要注意递归的一个关键就是递归的结束条件。这里,以1开头的排列的最后一个... 阅读全文
posted @ 2013-01-23 20:06 NeilHappy 阅读(605) 评论(0) 推荐(0)
产生所有排列---旋转法------2013年1月22日
摘要:我觉得这是一个很巧秒的算法。思路非常直接,从代码里可以很容易看出来,再单步调试查看set数组的值就可以很清楚地明白算法的过程。 代码如下: 1 #include <stdio.h> 2 #define MAX 1000 3 4 int n=3; //the number of set element 5 int set[MAX]={1,2,3}; 6 7 //move the set[0] to set[position] 8 int rotate(int position) 9 {10 int temp=set[0]; 11 int index;12 ... 阅读全文
posted @ 2013-01-22 16:01 NeilHappy 阅读(356) 评论(0) 推荐(1)
算法(数据结构)每天一题 2013年1月21日
摘要:今天的算法(数据结构)每天一题,没有把代码实现,但是基本思路已经很清晰了。记录一下。 阅读全文
posted @ 2013-01-21 12:07 NeilHappy 阅读(226) 评论(2) 推荐(0)
列出所有子集-----字典顺序 2013年1月14日
摘要:问题描述:写一个程序,用字典顺序把一个集合的所有子集找出来。 此题的思路来自《C语言名题精选百则技巧篇》:字典顺序,也就是字符串比较时的顺序规则。可以采取这样的思路(以下是我根据书上的思路进行归纳再加上我自己的理解得来的步骤): 先定义n是集合的个数并且集合是已经从小到大排好顺序的{1,2,3....n}的集合。集合从{1}开始(此时下标index=0), 1.当state[i]<n时,就向右进行扩展,将state[2]=2;接着将state[3]=3; 2.当state[index]==n时,就不能向右边进行扩展了,此时就需要向左边处理了。此时的集合是{1,2... 阅读全文
posted @ 2013-01-14 20:37 NeilHappy 阅读(1510) 评论(0) 推荐(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 an-bitbinary space could expressnumbers too.So our target is to generate all of the binary numbers in n bit space 阅读全文
posted @ 2013-01-04 16:34 NeilHappy 阅读(218) 评论(0) 推荐(0)
列出所有子集(采用列出2进制数的方法)-------------2013年1月4日
摘要:问题描述:列出给定集合的所有子集合,包括空子集。 思路:一个集合的所有子集合的个数是个(n是集合中元素的个数),而一个位数为n的二进制也可以表示个数,所以,只要产生出了所有二进制数,就可以列出所有的子集了。在二进制的求解中,先来看这样一个例子。11111 01111+ 1--------------------11111 10000 当这个数加1时,如果当前位是1,那么当前位就变成0并且向前进1位;接着前一位如果是1,也会变成0并且继续进位;以此类推,直到遇到当前位是0的情况,就变成1,然后整个加法就完成了。依照此思路,很容易写出代码。 1 #in... 阅读全文
posted @ 2013-01-04 16:10 NeilHappy 阅读(404) 评论(0) 推荐(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 an element in the super set for a subset is either on or off.Hence we can specialize the subset tree to a 阅读全文
posted @ 2013-01-03 20:30 NeilHappy 阅读(206) 评论(0) 推荐(0)
列出所有子集----------2013年1月3日
摘要:问题描述:列出一个集合的所有子集,包括空子集合。 我的思路:回溯法的一种思路就是生成一颗子集树,而一个集合中的元素,要么存在于子集中,要么不存在,所以这又特殊化成一颗二叉树了。每当到达二叉树的底端时,就打印一次。很容易写出如下的代码: 1 #include <stdio.h> 2 #define MAX 1000 3 4 int n=3; //the number of the set elements 5 int set[MAX]={1,2,3}; 6 int count=0;//the number of the subset. 7 8 void DFS(int level.. 阅读全文
posted @ 2013-01-03 20:10 NeilHappy 阅读(224) 评论(0) 推荐(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 delete it when we delete the multiples of 3 as we delete the same number when we delete the multiple 阅读全文
posted @ 2013-01-03 15:57 NeilHappy 阅读(286) 评论(0) 推荐(0)
A Sieve Method for Prime Numbers
摘要:Problem description:Calculate the prime numbers with a sieve method.There is amagical sieve that can remove all the multiple of the number i.Please calculate the prime numbers at a range from 2 to N by this way.There is a requirement that you should not use multiplication and division.You can only u 阅读全文
posted @ 2013-01-03 11:57 NeilHappy 阅读(330) 评论(0) 推荐(0)
线性筛法--------2013年1月2日
摘要:问题描述:在做筛法求质数的问题时,在删除非质数的数据时,有很多是重复删除的。例如,如果有一个数是3x7x17x23,那么在删除3的倍数时会删除它,删除7,17与23的倍数时也都会删除它。请写一个程序,在删除非质数时"绝对"不做重复的工作。 思路:有一个因式分解定理:任何一个合数都可以分解成若干个质数相乘的形式。那么,num一定可以分解成p的i次方乘以q的形式(p,q是质数且p<q)。所以,需要去除的数就变成了p的2次方,p的3次方,p的4次方......以及p的i次方乘以q,i=1,2,3.......p和q的取值是从小到大的没有被去除的数,所以很容易就可以写出如下的 阅读全文
posted @ 2013-01-02 21:02 NeilHappy 阅读(283) 评论(0) 推荐(0)

1 2 下一页