代码改变世界

回溯法总结

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

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

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

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

2011-10-03 12:39 by ...平..淡..., 192 阅读, 0 推荐, 收藏, 编辑
摘要:基本思想:将元素集合分成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-03 11:04 by ...平..淡..., 247 阅读, 0 推荐, 收藏, 编辑
摘要:一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器(Compiler)自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。-程序结束后有系统释放4、文字常量区—常量字符串就是放在这里的。程序结束 阅读全文

链表和数组的区别

2011-10-03 10:54 by ...平..淡..., 225 阅读, 0 推荐, 收藏, 编辑
摘要:(从 逻辑结构 和 内存存储 方面分析)A 从逻辑结构来看A-1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。A-2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)B 从内存存储来看B-1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小B-2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦. 阅读全文

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

2011-10-02 11:00 by ...平..淡..., 264 阅读, 0 推荐, 收藏, 编辑
摘要:排序算法基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分继续进行排序,以达到整个记录有序。排序算法中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 ...平..淡..., 221 阅读, 0 推荐, 收藏, 编辑
摘要:堆排序原理:首先构建最大堆,然后将第一个元素与最后一个元素交换,接着长度减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 ...平..淡..., 161 阅读, 0 推荐, 收藏, 编辑
摘要:插入排序原理:将第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 ...平..淡..., 198 阅读, 0 推荐, 收藏, 编辑
摘要:选择排序原理:循环查找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 ...平..淡..., 196 阅读, 0 推荐, 收藏, 编辑
摘要:还是将每个排序的分开来写,看起来会清楚些。交换排序算法的复杂度为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 阅读全文