代码改变世界

递归算法的时间复杂度分析[转]

2011-08-23 10:43 by Daniel Zheng, 712 阅读, 0 推荐, 收藏, 编辑
摘要:递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2+ 2(2T(n/4) + (n/2)2) 还可以继续迭代,将其完全展开可得: T(n) = n2+ 2((n/2)2+ 2((n/22)2+ 2((n/23)2+ 2((n/24)2+…+2((n/2i)2+ 2T(n/2i + 1)))…)))) ……(1) 而当n/2i+1== 1时,迭代结束。 将(1)式小括号展开,可得: T(n) = n2+ 2(n/2)2+ 22(n/22)2+ … + 2i(n/2i... 阅读全文

Fibonacci数列计算的三种方法

2011-08-22 21:38 by Daniel Zheng, 2751 阅读, 0 推荐, 收藏, 编辑
摘要:以下分别用递归,迭代,动态规划求解Fibonacci数列: 1 #include <iostream> 2 #include <ctime> 3 using namespace std; 4 5 int Fibonacci_R(int n) 6 { 7 if((n == 1)||(n == 2)) 8 return 1; 9 else10 return Fibonacci_R(n-1) + Fibonacci_R(n-2);11 }12 13 int Fibonacci_I(int n)14 {15 int A = 1; 16 ... 阅读全文

堆内存和栈内存详解[转]

2011-08-22 16:21 by Daniel Zheng, 689 阅读, 1 推荐, 收藏, 编辑
摘要:堆:顺序随意栈:先进后出堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量 阅读全文

深入理解递归函数的调用过程[转]

2011-08-22 14:36 by Daniel Zheng, 8627 阅读, 0 推荐, 收藏, 编辑
摘要:下面是个关于递归调用简单但是很能说明问题的例子:/*递归例子*/ 1 #include<stdio.h> 2 void up_and_down(int); 3 int main(void) 4 { 5 up_and_down(1); 6 return 0; 7 } 8 void up_and_down(int n) 9 {10 printf("Level %d:n location %p\n",n,&n); /* 1 */11 if(n<4)12 up_and_down(n+1);13 printf("Level %d:n locatio 阅读全文

带头结点的单链表反转

2011-08-22 14:33 by Daniel Zheng, 504 阅读, 0 推荐, 收藏, 编辑
摘要:1 #include <iostream> 2 using namespace std; 3 4 struct Node 5 { 6 public: 7 int data; 8 Node * pNode; 9 };10 11 12 void CreateList(Node * Header)13 {14 cout<<"Input the node data and end by 0"<<endl;15 int input;16 int count = 0;17 Node * oHeader = Header;18 while(cin> 阅读全文

最长公共子序列问题(转)

2011-08-21 22:24 by Daniel Zheng, 329 阅读, 0 推荐, 收藏, 编辑
摘要:转自http://blog.csdn.net/yysdsyl/article/details/4226630动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】求两字符序列的最长公共字符子序列问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定 阅读全文

最长公共子串问题

2011-08-21 10:23 by Daniel Zheng, 1078 阅读, 0 推荐, 收藏, 编辑
摘要:最长公共子串问题(longest common substring problem)也就是找到两个或以上的字符串的最长公共子串,该字串在位置上相邻。例如ABAB,BABA,ABBA,最长公共子串为AB。我们可以把该问题定义如下:给出两个字符串S和T,S的长度为m,T的长度为n,找出S与T的最长公共子串。假设S = “ABAB”,T=“BABA”,我们可以构造一个如下的矩阵:ABAB00000B00101A01020B00203A01030对于数组array[m][n],扩展为array[m+1][n+1],这样是为了方便初始化,减少循环中对边界的判断。if( S[i] == T[j] ) ar 阅读全文

汉诺塔问题

2011-08-20 01:16 by Daniel Zheng, 11680 阅读, 0 推荐, 收藏, 编辑
摘要:汉诺塔问题是使用递归解决问题的经典范例。 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。如果有3个盘子,那么. 阅读全文

八皇后问题

2011-08-20 01:07 by Daniel Zheng, 422 阅读, 0 推荐, 收藏, 编辑
摘要:八皇后问题是一个国际象棋以为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 我们定义这样的一个一维数组,数组的下标表示第i行,数组的值表示第i列,数组大小为8,把数组初始化为从0到7的八个不同值。相当与对01234567做全排列,这样所以的数字自然不再同一行,同一列,即数组下标的值各不相同,数组的值各不相同,且都是取从0到7的不同值。 现在要解决的就是对角线的问题,如果两个元素处在同一对角线,则有数组下标之差的绝对值等于数组元素值之差的绝对值。即 abs(i-j) 阅读全文

字符串的全排列问题

2011-08-20 00:35 by Daniel Zheng, 390 阅读, 0 推荐, 收藏, 编辑
摘要:对于一个字符串abc, 求它的全排列可以这样分析:第一个字符为a时,bc的全排列第一个字符为b时,ac的全排列第一个字符为c时,ab的全排列对上述各种情况的子串采用相同的方法,直到子串只有一个字符为止,全排列就是它自身。各处代码:void swap(char * a, char * b){ char temp = *a; *a = *b; *b = temp; }void permutation(char *s, int start, int end) //end = strlen(s){ int i; if (start == end) { ... 阅读全文