摘要:
1 #include <queue> 2 #include <iostream> 3 using namespace std; 4 5 #define QSIZE 100 6 struct BTree 7 8 { 9 int value; 10 struct BTree* lChild; 11 struct BTree* rChild; 12 }; 13 14 void VisitNode(BTree * T) 15 { 16 cout<<T->value<<" "; 17 } 18 BTree * Insert(BTr 阅读全文
随笔分类 - Algorithm
动态规划求解0/1背包问题
2011-08-23 18:08 by Daniel Zheng, 2389 阅读, 收藏, 编辑
摘要:
什么是动态规划?动态规划是一种在数学和计算机科学中使用的,用于求解包含重叠子问题的最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等。动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。动态规划只能应用于有最优子结构的问 阅读全文
递归算法的时间复杂度分析[转]
2011-08-23 10:43 by Daniel Zheng, 716 阅读, 收藏, 编辑
摘要:
递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: 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, 2758 阅读, 收藏, 编辑
摘要:
以下分别用递归,迭代,动态规划求解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 14:36 by Daniel Zheng, 8637 阅读, 收藏, 编辑
摘要:
下面是个关于递归调用简单但是很能说明问题的例子:/*递归例子*/ 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, 508 阅读, 收藏, 编辑
摘要:
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, 331 阅读, 收藏, 编辑
摘要:
转自http://blog.csdn.net/yysdsyl/article/details/4226630动态规划法经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。【问题】求两字符序列的最长公共字符子序列问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列。令给定 阅读全文
最长公共子串问题
2011-08-21 10:23 by Daniel Zheng, 1081 阅读, 收藏, 编辑
摘要:
最长公共子串问题(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, 11753 阅读, 收藏, 编辑
摘要:
汉诺塔问题是使用递归解决问题的经典范例。 汉诺(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, 424 阅读, 收藏, 编辑
摘要:
八皇后问题是一个国际象棋以为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。 我们定义这样的一个一维数组,数组的下标表示第i行,数组的值表示第i列,数组大小为8,把数组初始化为从0到7的八个不同值。相当与对01234567做全排列,这样所以的数字自然不再同一行,同一列,即数组下标的值各不相同,数组的值各不相同,且都是取从0到7的不同值。 现在要解决的就是对角线的问题,如果两个元素处在同一对角线,则有数组下标之差的绝对值等于数组元素值之差的绝对值。即 abs(i-j) 阅读全文
字符串的全排列问题
2011-08-20 00:35 by Daniel Zheng, 393 阅读, 收藏, 编辑
摘要:
对于一个字符串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) { ... 阅读全文
常见C语言库函数源码
2011-08-18 15:19 by Daniel Zheng, 2303 阅读, 收藏, 编辑
摘要:
memcpy和memmove功能基本上差不多,但是当源串和目标串有Overlap时,memmove可以正确处理,memcpy则不行。void * __cdecl memcpy (void * dst, const void * src, size_t count){ void * ret = dst; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret);}void * __cdecl memmove (void * dst, cons 阅读全文
STL Algorithms
2011-08-14 20:25 by Daniel Zheng, 349 阅读, 收藏, 编辑
摘要:
One important part of the standard template library is a set of generic functions, supplied by the header <algorithm>. that help manipulate or work with the contents of a container.What Are STL Algorithms?Finding, searching, removing, and counting are some generic algorithmic activities that f 阅读全文