代码改变世界

随笔分类 -  数据结构与算法

最长上升子序列

2011-10-08 22:51 by ...平..淡..., 168 阅读, 收藏,
摘要: 纠结了一晚上,总算理解了。。。欣慰~~方法1 1 /* 2 动态规划求解思路分析:O(n^2) 3 4 经典的O(n^2)的动态规划算法,设arr[i]表示序列中的第i个数,dp[i]表示从1到i这一段中以i结尾的最长上升子序列的长度, 5 初始时设dp[i] = 0(i = 1, 2, ...,len(arr))。则有动态规划方程:dp[i] = max{1,dp[j]+1} (j=1, 2, ..., i-1, 且arr[j]<arr[i])。 6 7 */ 8 #include <iostream> 9 using namespace std;10 int arr[10 阅读全文

高精度大整数加法

2011-10-05 11:31 by ...平..淡..., 327 阅读, 收藏,
摘要: 今天偶然在逛网页时,发现了这题。之前在算法书上也有看到,不过还是觉得这个解法更简单,易于理解。附上代码,大家多多交流。O(∩_∩)O哈哈~此方法采用栈的结构来存储加数(栈1、栈2)和结果(栈3)。1.用字符数组存储输入的加数,一位位存入栈(栈1、栈2)中,这样栈顶元素是最低位。2.将两个栈(栈1、栈2)元素出栈相加,结果存入栈3中,并保存进位。(此时,栈3的栈顶元素为最高位)3.处理栈1、栈2中剩下的元素。4.栈3出栈,输出结果高精度大整数加法 1 #include <iostream> 2 #include <stack> 3 using namespace std; 阅读全文

3.求子数组的最大和

2011-10-04 14:28 by ...平..淡..., 170 阅读, 收藏,
摘要: 这道题是用动态规划做的,我的第一篇随笔就记录了。这里因为做题的缘故,因此重新写一遍。可以参考我的那篇随笔:http://www.cnblogs.com/chenbin7/archive/2011/09/26/2191275.html求子数组的最大和 1 #include <iostream> 2 using namespace std; 3 4 int maxofsum(int *a,int n) 5 { 6 int sum=0,b=0; 7 for(int i=0;i<n;i++) 8 { 9 if(b>=0)10 b... 阅读全文

1.把二元查找树转变成排序的双向链表

2011-10-04 13:47 by ...平..淡..., 192 阅读, 收藏,
摘要: 参照了别人的代码,自己写一遍,好好理解下View Code 1 #include <iostream> 2 using namespace std; 3 4 struct BSTreeNode 5 { 6 BSTreeNode *m_pLeft; 7 BSTreeNode *m_pRight; 8 int m_Value; 9 };10 11 BSTreeNode *phead;12 BSTreeNode *pnext;13 14 void converttoDoubleList(BSTreeNode *pCurrent) //结点链表化15 {16 ... 阅读全文

回溯法总结

2011-10-03 13:45 by ...平..淡..., 482 阅读, 收藏,
摘要: 对于回溯法,其实跟深度优先搜索很类似,都是一直往下遍历,在一条路上搜索完毕时,才会返回到另一条,继续遍历。列出书上描述的步骤:1.定义所要求解问题的解空间(就是解的各种情况)2.构造易于检索的状态空间树3.按照深搜检索解空间ps:在此过程中要避免无效检索分析:1.问题的解空间中至少有一个是问题的解,而问题的解通常都会满足一系列的约束条件:(1)显式约束条件:给出了解空间中x[i]的取值范围(2)隐式约束条件:规定了问题的可行解必须满足的条件这些约束条件用于减少检索次数,提高时间复杂度。 阅读全文

深度优先搜索和广度优先搜索

2011-10-03 13:18 by ...平..淡..., 437 阅读, 收藏,
摘要: 这是我根据下面黑体字总结的:深度优先搜素算法:不全部保留结点,占用空间少;有回溯操作(即有入栈、出栈操作),运行速度慢。广度优先搜索算法:保留全部结点,占用空间大; 无回溯操作(即无入栈、出栈操作),运行速度快。通常深度优先搜索法不全部保留结点,扩展完的结点从数据库中弹出删去,这样,一般在数据库中存储的结点数就是深度值,因此它占用空间较少。所以,当搜索树的结点较多,用其它方法易产生内存溢出时,深度优先搜索不失为一种有效的求解方法。 广度优先搜索算法,一般需存储产生的所有结点,占用的存储空间要比深度优先搜索大得多,因此,程序设计中,必须考虑溢出和节省内存空间的问题。但广度优先搜索法一般无回溯操. 阅读全文

排序算法-------归并排序

2011-10-03 12:39 by ...平..淡..., 207 阅读, 收藏,
摘要: 基本思想:将元素集合分成2个集合,对每个集合单独分类,然后将已分类的两个序列归并成一个含有n个元素的分类好的序列。这种思想是典型的分治法的设计思想。归并排序 1 #include <iostream> 2 using namespace std; 3 4 //元素交换 5 void swap(int &a,int &b) 6 { 7 int temp=a; 8 a=b; 9 b=temp;10 }11 12 /*///////////////////////////////////////////////13 归并排序14 */15 void Merge(int * 阅读全文

排序算法-------快速排序

2011-10-02 11:00 by ...平..淡..., 279 阅读, 收藏,
摘要: 排序算法基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分继续进行排序,以达到整个记录有序。排序算法中Partition函数的作用可通过下图描述:首先,定义i、j,i指向首元素的前一个位置,j指向首元素。然后,比较第j个元素和第r个元素大小,若第j个元素小,则i+1,交换第i个元素和第j个元素最后,循环结束,交换第i+1个元素和第r个元素通过上面的步骤,就可以达到将待排序的元素分割成两个独立部分,并且前面部分最大元素小于后面部分最小元素。快速排序 1 #include <iostream> 2 using names 阅读全文

排序算法-------堆排序

2011-10-02 10:32 by ...平..淡..., 236 阅读, 收藏,
摘要: 堆排序原理:首先构建最大堆,然后将第一个元素与最后一个元素交换,接着长度减1,继续构建最大堆,直到排序完成。堆排序 1 /* 2 步骤: 3 4 ①.构建最大堆 5 ②.交换首尾元素 6 ③.长度减1,重新构建最大堆 7 ④.循环②、③步骤 8 */ 9 #include <iostream>10 using namespace std;11 12 13 //元素交换14 void swap(int &a,int &b)15 {16 int temp=a;17 a=b;18 b=temp;19 }20 21 /*/////////////////////////// 阅读全文

排序算法-------插入排序

2011-10-02 10:04 by ...平..淡..., 166 阅读, 收藏,
摘要: 插入排序原理:将第i个元素与前i-1个元素从右向左开始比较,若第i个元素小,则将前面的元素向后移,直到找到可以插入的位置。插入排序 1 #include <iostream> 2 using namespace std; 3 4 5 //元素交换 6 void swap(int &a,int &b) 7 { 8 int temp=a; 9 a=b;10 b=temp;11 }12 13 /*///////////////////////////////////////////////14 插入排序15 */16 void InsertSort(int *a,int 阅读全文

排序算法-------简单选择排序

2011-10-02 09:41 by ...平..淡..., 211 阅读, 收藏,
摘要: 选择排序原理:循环查找n个元素中最小的元素,与第一个元素进行交换;继续查找n-1个元素中最小的元素,与第二个元素交换.....直至完成简单选择排序 1 #include <iostream> 2 using namespace std; 3 4 5 //元素交换 6 void swap(int &a,int &b) 7 { 8 int temp=a; 9 a=b;10 b=temp;11 }12 13 /*///////////////////////////////////////////////14 简单选择排序15 */16 void SelectSort(i 阅读全文

排序算法-------交换排序算法

2011-10-01 21:16 by ...平..淡..., 204 阅读, 收藏,
摘要: 还是将每个排序的分开来写,看起来会清楚些。交换排序算法的复杂度为O(n^2).交换排序 1 #include <iostream> 2 using namespace std; 3 4 5 //元素交换 6 void swap(int &a,int &b) 7 { 8 int temp=a; 9 a=b;10 b=temp;11 }12 13 /////////////////////////////////////////////////14 15 /*16 交换排序17 原理:第i个元素与后续的n-i个元素一一比较18 */19 void ExchangeSor 阅读全文

排序算法-------冒泡排序及其优化

2011-10-01 20:54 by ...平..淡..., 491 阅读, 收藏,
摘要: 冒泡排序的原理:可以从最后一个元素开始,依次比较相邻两个元素,较小的数往上冒,一次循环结束,最小的元素上升到首位置,然后继续这样比较剩下的n-1个元素。冒泡排序及其优化 1 #include <iostream> 2 using namespace std; 3 4 5 //元素交换 6 void swap(int &a,int &b) 7 { 8 int temp=a; 9 a=b; 10 b=temp; 11 } 12 13 /*/////////////////////////////////////////////// 14 冒泡排序(未... 阅读全文

求二进制数中1的个数

2011-09-29 12:00 by ...平..淡..., 166 阅读, 收藏,
摘要: 编程之美中有这道题,不过我比较喜欢上面的有一种方法,很简洁,如下: 1 #include <iostream> 2 using namespace std; 3 int main() 4 { 5 int v = 9,count=0; 6 while(v) 7 { 8 v&=(v-1); 9 count++;10 }11 cout<<count<<endl;12 return 0;13 }上次看到另一种方法,编程之美好像没有讲,感觉也很牛逼,如下: 1 /* 2 分析如下: 3 举个例子,给定一个数,为 10 01 ... 阅读全文

回溯法-------图的m--着色问题

2011-09-29 10:49 by ...平..淡..., 525 阅读, 收藏,
摘要: 在题目的求解过程中,遇到了关于将二维数组作为参数传递给函数的问题,纠结了半天,上网查了一些,我在下一篇日志中得总结一下了。。。图的m--着色问题 1 /* 2 图的m--着色问题分析: 3 通过解空间分析,可推断用回溯法求解。 4 限界条件:判断k点与其他点i存在边的情况下,为k点找到的颜色是否与i相同 5 */ 6 #include <iostream> 7 using namespace std; 8 9 int x[100];10 11 int NextColor(int k,int n,int m,int **G) //寻找下一种颜色 12 {13 w... 阅读全文

回溯法-------n皇后问题

2011-09-27 11:49 by ...平..淡..., 327 阅读, 收藏,
摘要: n皇后问题 1 /* 2 n皇后问题 3 k表示行号,x[k]表示列号 4 */ 5 #include <iostream> 6 #include <cmath> 7 using namespace std; 8 int x[100]; 9 10 bool place(int k) //判断此位置是否可以放皇后11 {12 int i=0;13 while(i<k)14 {15 if( (x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k) ) )16 {17 ... 阅读全文

回溯法-------子集和数问题

2011-09-27 10:11 by ...平..淡..., 906 阅读, 收藏,
摘要: 用回溯法解决,需要找到一个限界条件来简化复杂度此题限界条件为 (s+r-w[k])>=M && (s+w[k+1])<=M子集和数 1 /* 2 子集和数问题 3 s代表目前选中的w[i]x[i]的结果,k代表选择的第几个数,r代表w[i]的和. 4 */ 5 #include <iostream> 6 using namespace std; 7 8 int x[100]; 9 10 void SumofSub(int s,int k,int r,int M,int *w)11 {12 x[k]=1;13 if(s+w[k]==M) ... 阅读全文

动态规划-------最大子段和

2011-09-26 10:55 by ...平..淡..., 307 阅读, 收藏,
摘要: 最大子段和 1 /* 2 b[]的递归式为 3 b[j]={ b[j-1]+a[j] , b[j-1]>=0 4 a[j] , b[j-1]<0 } 5 */ 6 #include <iostream> 7 using namespace std; 8 9 int MaxSum(int n, int *a)10 {11 int sum=0; 12 int b=0;13 for (int i=0;i<n;i++)14 {15 if (b>0) b+=a[i]; else b=a[i];16... 阅读全文

回溯法-------迷宫问题

2011-09-26 10:04 by ...平..淡..., 201 阅读, 收藏,
摘要: 迷宫问题 1 #include <iostream> 2 using namespace std; 3 4 int flag = 0; 5 const int m = 5; 6 const int n = 5; 7 int a[m][n] = { 8 {0,0,0,1,1}, 9 {1,0,0,0,0},10 {0,1,1,0,1},11 {1,0,0,0,0},12 {0,1,0,1,0}13 };14 void search(int x,int y)15 {16 if((x==m-1)&&(y... 阅读全文