
算法导论
文章平均质量分 64
IT_job
这个作者很懒,什么都没留下…
展开
-
C++单链表插入翻转更新删除等基本操作及实例运行结果
链表是一种复杂的数据结构,其数据之间的相互关系使链表分成三种:单链表、循环链表、双向链表,这里介绍单链表。我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表可以满足我们这种需求。它在程序的执行过程中根据需要,有数据存储就向系统要求申请存储空间,不会对存储区的浪费。链表中的每一个节点的数据类型为结构体类型,节点有两个成员:整型成员和指向下一个结构体类型节点的指针。c+原创 2017-12-23 17:36:04 · 902 阅读 · 0 评论 -
雇佣问题原址排列给定数组(randomize In Place)-c++代码实现及运行实例结果
在进行第i次迭代时,元素A[i]是从元素A[i]到A[n]中随机选取的伪代码c++代码#include #includeusing namespace std;#define N 20//数组大小为20void randomizeInPlace(int array[],int len);int main(){ int Array[N]; for原创 2017-12-16 22:23:20 · 500 阅读 · 0 评论 -
最大子数组问题-暴力求解-c++代码实现及运行实例结果
问题描述:假定你获得了投资挥发性化学公司的机会。给出一支股票17天价格表,要求求出买进卖出获得的最大化收益及买进时刻卖出时刻.......详见算法导论第三版思路:所有连续子数组组合,然后从中选取最大的c++代码#include using namespace std;class Array{private:public: int indexLow; int原创 2017-12-15 14:48:02 · 633 阅读 · 0 评论 -
插入排序(正序、倒序)-c++代码实现及运行实例结果
伪代码c++代码#include using namespace std;void insertion_sort(int arr[], int length);int main(){ int Arr[] = { 2, 1, 5, 7, 3, 4, 8, 6 }; int len = sizeof (Arr) / sizeof (Arr[0]);原创 2017-12-13 16:00:04 · 1509 阅读 · 0 评论 -
查找-c++代码实现及运行实例结果
考虑以下查找问题: 输入:n个数的一个序列A={ a1,a2, ..., an } 和一个值v。 输出:下标i使得v=A[i]或者当v不在A中时,v为特殊值NIL。举例:输入n=5作为数组,若重新输入的数v存在于数组中则返回值为数组下标,不存在则输出100000伪代码cpp代码#include using namespace std;int原创 2017-12-13 18:50:30 · 766 阅读 · 0 评论 -
归并排序-c++代码实现及运行实例结果
假设桌上有两堆牌面朝上的牌,每堆都已排序,最小的牌在顶上。我们希望把这两堆牌合并成单一的排好序的输出堆,牌面朝下地放在桌上。我们的基本步骤包括在牌面朝上的两堆牌的顶上两张牌中选取较小的一张,将该牌从其堆中移开(该堆的顶上将显露一张新牌)并牌面朝下地将该牌放置到输出堆。归并排序相关文字资料网上较多,在此不再叙述。cpp代码#includeusing namespace std;vo原创 2017-12-14 00:39:39 · 1037 阅读 · 0 评论 -
选择排序-c++代码实现及运行实例结果
考虑排序存储在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法称为选择排序算法,写出伪代码。伪代码for i=1 to A.length-1 min = A[i]; k = i; //k为最小值的下标 j = i + 1; while j<A.le原创 2017-12-14 14:09:08 · 580 阅读 · 0 评论 -
冒泡排序-c++代码实现及运行实例结果
冒泡排序是一种流行但低效的排序算法,第一次循环将最小的数放在数组第一位,第二次循环将次最小数放在数组第二位…伪代码C++代码#include using namespace std;void bubbleSort(int array[],int len);int main(){ int Array[]={ 2, 1, 5, 7, 3, 4, 8,原创 2017-12-14 21:05:30 · 1998 阅读 · 0 评论 -
最大子数组问题-c++代码实现及运行实例结果
问题描述:假定你获得了投资挥发性化学公司的机会。给出一支股票17天价格表,要求求出买进卖出获得的最大化收益及买进时刻卖出时刻.......详见算法导论第三版伪代码c++代码#include using namespace std;/*数组需要下标,定义结构体*/class Array{private:public: int indexLow;原创 2017-12-15 11:31:33 · 785 阅读 · 0 评论 -
数据结构之栈的初始化、创建、入栈、出栈、销毁-c++代码实现及运行实例结果
一部分伪代码c++代码#include using namespace std;#define stack_Size 100/*堆是一种数据结构,用数组的形式表现出来*/class stackClass//不需要typedef{private: int data[stack_Size]; int top;public: void i原创 2017-12-17 22:27:20 · 2527 阅读 · 1 评论 -
球与箱子-c++代码实现及运行实例结果
现在我们来考虑这样一个过程,即把相同的球随机投到b个箱子里,箱子编号为1,2,...,b。每次投球都是独立的,每一次投球,球等可能落在每一个箱子中。球落在任一个箱子中的概率为1/b。在平均意义下,我们必须要投多少个球,才能在给定的箱子里投中一个球?这个问题也称为礼券收集者问题,意思是一个人如果想要收集齐b种不同礼券中的每一种,大约需要blnb张随机得到的礼券才能成功。数学推导见算法导论第三版原创 2017-12-17 09:25:41 · 2234 阅读 · 1 评论 -
生日悖论-c++代码实现及运行实例结果
一个屋子里人数必须达到多少人,才能使其中两个人生日相同的机会达到50%根据wiki中的伪代码编写的代码伪代码为c++代码为#include using namespace std;int main(){ int days=365; int numberPeople=1; double probility=0; while(probi原创 2017-12-17 00:34:58 · 1911 阅读 · 0 评论 -
c++实现计数排序countingSort及运行实例结果
前面博文写的排序算法都是比较排序,这里介绍三种非比较的排序算法,计数排序、基数排序、桶排序。第一种:计数排序的基本思想:对于每一个输入元素x,确定出小于x的元素的个数。假如有17个元素小于x,则x就属于第18个输出位置。详见算法导论第三版伪代码c++代码#include #define length 8using namespace std;void c原创 2017-12-27 18:29:56 · 601 阅读 · 0 评论 -
c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
扩展动态规划算法,使每个子问题不仅保存最优收益值,还保存对应的切割方案,这样可以输出最优解伪代码c++代码实现#include using namespace std;int extendedBottomUpCutRod(int p[],int n,int r[],int s[]){ //int r[n+1];记录不同规模子问题原创 2017-12-28 15:17:12 · 1038 阅读 · 0 评论 -
c++使用朴素递归算法(自顶向下递归)和动态规划dp(带备忘的自顶向下,自底向上)解决钢条切割及运行实例结果
本博文资料来源于算法导论第三版动态规划有两种等价实现方法:带备忘的自顶向下发(topDownWithMemoization),自底向上方法,付出额外的内存空间来节省计算时间,是典型的时空权衡,递归时会保存每个子问题的解长度n与对应价格p关系1~10的对应最优收益朴素递归之自顶向下方法伪代码c++代码#inclu原创 2017-12-28 13:38:58 · 2132 阅读 · 0 评论 -
C++实现矩阵链乘法利用动态规划及运行实例结果
矩阵乘法满足结合律,所以哪里加括号不影响最终结果,括号加在不同的地方会对运算代价产生巨大影响,因此在进行矩阵链乘法时需要考虑那些矩阵先相乘以减少运算代价。下面使用动态规划方法实现矩阵链乘法伪代码c++实现代码#include #define N 7using namespace std;void matrixChainOrder(int p[],int原创 2017-12-28 20:27:01 · 2781 阅读 · 0 评论 -
雇佣问题随机排列数组(permuteBySorting)-c++代码实现及运行实例结果
为数组中A每个元素随机赋一个优先级,然后依据优先级P对数组进行排序,详细见算法导论第三版或者网上伪代码c++代码#include #include#define N 20//数组大小为20void randP(int prior[],int len);void permuteBySorting(int array[],int prior[],int len)原创 2017-12-16 20:20:16 · 882 阅读 · 0 评论 -
雇佣问题(hireassistant)-c++代码实现及运行实例结果
假设你要雇佣一个新的办公室助理,雇佣代理每天想你推荐一个应聘者(连续推荐n个),你面试这个人,如果这个应聘者比目前的办公室助理更优秀,你就会辞掉当前的办公室助理,然后聘用这个新的。面试一个人需付给雇佣代理一笔费用,聘用办公助理也需要费用。分析:假定这些应聘者按照好坏已经排好序了,但招聘者并不知道,所以假定这些应聘者是随机来的,具体见算法导论第三版或者网上伪代码:c+原创 2017-12-16 16:00:03 · 1081 阅读 · 0 评论 -
c++实现快速排序随机化quickSortRandom及运行实例结果
快速排序请参考上一篇博文为什么需要随机化?我们在讨论快速排序平均性能时,前提假设是:输入数据的所有排练都是等概率的,但在实际工程中这种情况不总是成立的,所以引入随机化,随机选取一个元素作为主元,因为主元是随机选取的,我们期望在平均情况对输入数组的划分是比较均衡的伪代码c++代码#include using namespace std;//与原创 2017-12-27 15:14:54 · 1672 阅读 · 0 评论 -
c++实现快速排序quickSort及运行实例结果
来源于算法导论第三版算法思想伪代码c++代码#include using namespace std;int partition(int array[],int p,int r){ int x=array[r];//作为主元 int i=p-1; for(int j=p;j<r;++j) {原创 2017-12-27 14:45:18 · 1529 阅读 · 0 评论 -
最大优先队列,最小优先队列使用(c++)及运行实例结果
优先队列是一种用来维护由一组元素构成的集合的数据结构,可以用堆来实现。在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问。最大优先队列可用于共享计算机系统的作业调度等,最小优先队列可用于基于事件驱动的模拟器等。最大优先队列c++代码#include #includeusing namespace std;/*定义一串数x与对应的优先级p*/class原创 2017-12-27 12:54:27 · 2077 阅读 · 0 评论 -
c++实现最大堆维护maxHeapify及运行实例结果
来源于算法导论第三版参考伪代码c++代码#include using namespace std;//交换两数大小void exchange(int &a,int &b){ int temp; temp=a; a=b; b=temp;}//左孩子,右孩子int left(int i){ return i*2;}原创 2017-12-27 00:18:54 · 736 阅读 · 0 评论 -
c++实现堆排序及运行实例结果
这是算法导论上的例题可以参考以下伪代码c++代码#includeusing namespace std;//交换两数大小void exchange(int &a,int &b){ int temp; temp=a; a=b; b=temp;}//左孩子,右孩子int left(int i){ re原创 2017-12-27 00:08:07 · 789 阅读 · 0 评论 -
c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
这是算法导论中二叉树搜索的一个例题二叉树为c++代码为#include#define N 7using namespace std;//二叉树节点类class node{public: int data; node *leftChild; node *rightChild;};typedef node *BiTree;//等价//创建节原创 2017-12-26 13:45:10 · 1355 阅读 · 0 评论 -
c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
这是算法导论中二叉树搜索的一个题二叉树如图所示c++代码#include#define N 7using namespace std;//定义节点class node{public: int data; node *leftChild;//指针 node *rightChild;};typedef node *BiTree;//等价原创 2017-12-24 00:50:56 · 6275 阅读 · 3 评论 -
数据结构之队列的基本操作入队出队初始化删除-c++代码实现及运行实例结果
C++的头文件已经包含了队列如下所示,但我们也要了解一下他们的实现原理,而且stl提供的容器都是“通用版本”,在解决某些具体问题时,stl不一定是最合适最高效的,有时候还是要自己实现特化版本……,所以自己编写一次代码直接调用头文件方法代码如下:#include #include//头文件using namespace std;int main(){ queue原创 2017-12-19 00:43:56 · 2236 阅读 · 0 评论 -
生日悖论扩展引申2-c++代码实现及运行实例结果
必须要有多少人,才能让至少两个人生日为7月4日的概率大于1/2思路:假设房间里有n个人,其中没有人生日在7月4日的概率为 只有一个人生日在7月4日的概率为 所以至少两人生日在这一天为p=1-p1-p1c++代码#include #includeusing namespace std;int main(){ int days=365;//一年原创 2017-12-17 15:09:27 · 598 阅读 · 0 评论 -
生日悖论扩展引申1-c++代码实现及运行实例结果
描述:一个房间里必须要有多少人,才能让某人和你生日相同的概率至少为1/2?思路:首先你的生日固定在某一天,假设有n个人,每个人与你生日不同的概率均为364/365,n个人与你生日不同的概率一共为(364/365)^n,有人相同取其对立面即可c++代码#include #includeusing namespace std;int main(){ int da原创 2017-12-17 13:20:07 · 801 阅读 · 0 评论 -
在线雇佣问题(onlineMaximumHireAssistant)-c++代码实现及运行实例结果
假设现在我们不希望面试所有的应聘者以找到最好的一个。我们也不希望因为有更好的申请者出现,不停雇佣新人解雇旧人。我们愿意雇用接近最好的应聘者,只雇用一次。我们必须遵守公司的一个要求:在每次面试后,或者必须立即提供职位给应聘者,或者拒绝。在最小化面试次数和最大化雇用应聘者的质量两方面如何取得平衡?伪代码c++代码#include #include#define N 20u原创 2017-12-17 10:59:17 · 1308 阅读 · 0 评论 -
矩阵相乘-c++代码实现及运行实例结果
代码实现两矩阵相乘伪代码c++代码#include #includeusing namespace std;/*此程序两个矩阵均为行列相同的方阵*/void matrixMultiply(int a[2][2],int b[2][2],int c[2][2]);int main(){ int A[2][2]={1,2,3,4};//初始化 in原创 2017-12-15 17:17:42 · 2884 阅读 · 0 评论 -
矩阵相乘strassen-c++代码实现及运行实例结果
理论知识参见算法导论第三版以及百度伪代码c++代码#include using namespace std;#define N 2//以二维方阵为例template//使用模板保证矩阵可以为不同类型如int,double等void output(T D[N][N],int n);templatevoid strassen(T A[N][N],原创 2017-12-16 00:40:17 · 1081 阅读 · 0 评论 -
复数四则运算-c++代码实现及运行实例结果
c++代码#include using namespace std;class complex//类置于开始部分{private: double imag;//虚部实部 double real;public: complex add(complex x);//四则运算 complex sub(complex x); comp原创 2017-12-16 12:39:57 · 3053 阅读 · 0 评论 -
复数乘法运算(三次实数乘法)-c++代码实现及运行实例结果
设计算法,仅使用三次实数乘法即可完成复数Z1=a+b*i,Z2=c+d*i相乘,根据复数乘法的计算公式:Z1*Z2=(a*c-b*d)+(a*d+b*c)i,可以使用加法或者减法来减少乘法运算的时间。计算temp1=a*d,temp2=b*c,temp3=(a+b)(c-d),虚部为temp1+temp2,实部为temp3+temp1-temp2c++代码#include us原创 2017-12-16 14:20:36 · 7643 阅读 · 1 评论 -
对动态规划DP求解最优化问题的理解及应满足的条件
适合使用动态规划求解最优化问题应具备两个条件:最优子结构和子问题重叠最优子结构:如果一个问题的最优解包含其子问题的最优解,我们就称其为具有最优子结构。在动态规划中我们通常自底向上的使用最优子结构,即首先求得子问题的最优解,然后求原问题的最优解。子问题重叠:如果递归算法反复求解相同的子问题,我们就称最优化问题具有子问题重叠。子问题空间必须足够小,即问题的递归算法会反复的求解相同的子问题,而不原创 2017-12-28 21:08:51 · 2906 阅读 · 0 评论