代码改变世界

随笔档案-2011年10月

最长上升子序列

2011-10-08 22:51 by ...平..淡..., 167 阅读, 收藏,
摘要: 纠结了一晚上,总算理解了。。。欣慰~~方法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 ...平..淡..., 326 阅读, 收藏,
摘要: 今天偶然在逛网页时,发现了这题。之前在算法书上也有看到,不过还是觉得这个解法更简单,易于理解。附上代码,大家多多交流。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 ...平..淡..., 190 阅读, 收藏,
摘要: 参照了别人的代码,自己写一遍,好好理解下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 22:10 by ...平..淡..., 340 阅读, 收藏,
摘要: 1.当构造函数只接受一个参数时,则该类可以与该参数类型相同的值转换。看下面这个简单的例子:12345678910111213141516// Woo.h file#ifndef WOO_H#define WOO_Hclass Woo{private: double mm;public: /*explicit*/ Woo(double a); Woo() {mm=0;}; void show(); //operator double() const;};#endif123456789101112131415161718192021// Woo.cpp file#include "sto 阅读全文

[转]二维数组和二级指针的传递问题

2011-10-03 21:39 by ...平..淡..., 2301 阅读, 收藏,
摘要: 再次看这篇文章,感觉说的好多都是废话,在文章最前面补充一句话:“[]的优先级高于*”,大家可以带着这句话看下面的~~~========================再一次的见证了自己的基础不牢靠。。。幸好发现得早,看见网上说,华为的一个面试题就考了这个方面的。借那道华为的面试题引出问题,题目:char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么?可能有一部分朋友会回答正确,这里他们认为,a[]是一级指针,a[][]就是二级指针。那这个到底对不对呢?OK,用事实说话:1234567891011121314151617// Author: Tanky Woo// 阅读全文

回溯法总结

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

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

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

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

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

链表和数组的区别

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

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

2011-10-02 11:00 by ...平..淡..., 272 阅读, 收藏,
摘要: 排序算法基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分继续进行排序,以达到整个记录有序。排序算法中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 ...平..淡..., 231 阅读, 收藏,
摘要: 堆排序原理:首先构建最大堆,然后将第一个元素与最后一个元素交换,接着长度减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 冒泡排序(未... 阅读全文

[转]函数指针简单讲解

2011-10-01 19:39 by ...平..淡..., 298 阅读, 收藏,
摘要: 本文出自http://www.wutianqi.com/?p=2721因为基本没用过函数指针,所以对这个概念及用法比较模糊,最近温习C++在,再次看见这个概念,于是百度了下,看见网上有很多关于函数指针的文章,不过在纷纷转载的过程中,格式上的错位,让人看着难受,我自己也简单的总结下,方便以后查阅。首先要清楚一个概念:1.数组的数组名就是这个数组的地址,也即数组第一个元素的地址(指针)。2.函数的函数名就是这个函数的入口地址(指针)。3.结构体的结构名不是这个结构的地址,要取得结构体的地址,必须得用&(取地址运算符)。其次,还得对函数指针,指针函数,数组指针,指针数组这四个容易混淆的概念区 阅读全文