
C++算法
SilenceHell
学生,希望能在csdn上学到知识。
展开
-
十大经典比较算法
推荐一个比较好的博客:https://www.cnblogs.com/onepixel/articles/7674659.html此贴仅做记录不做解释。转载 2019-06-04 20:40:50 · 5634 阅读 · 1 评论 -
树和二叉树
一.树和二叉树的基本知识 树的显而易见的知识不作介绍。 级:树根是一级,其孩子(如果有是二级)孩子的孩子是三级。(这里需要注意的是,级是从1开始算的,而不是0)。高度(深度):树中级的个数。元素的度:该元素孩子的个数,也节点的度为0。一棵树的度:其所拥有元素的度的最大值。二叉树:一颗二叉树t是有限个元素的集合(可以为空)。当二叉树非空时,其中有一个元素称为根,余下的元素(如果有...原创 2018-07-27 10:38:38 · 718 阅读 · 0 评论 -
优先级队列的实现
优先级队列:队列里面的所有元素都有相应的权值,元素的删除顺序由这些权值决定。 优先级队列的实现一般用堆来实现其效率比一般的实现要高。 要弄清楚堆我们得先弄清楚下面的定义: 一颗大根树(小根树):是这样一棵树,其中每个节点的值都大于(小于)或等于其子节点(如果有子节点的话)的值。 大根堆:一个大根堆(小根堆)即是大根树(小根树)也是完全二叉树。 由于大根堆为完全二叉树,所以我们能用数组来实...原创 2018-07-30 13:40:39 · 1537 阅读 · 0 评论 -
列车车厢重排问题
列车车厢重排就是有一个条铁轨,铁轨有入口和出口,入口和出口之间有三个3个缓冲轨道,缓冲轨道以栈的形式运行,一列货车上有若干个车厢,但是他们的编号是杂乱的,我们想通过这个转轨站,将列车的编号进行重新排列。arrayStack<int> *track;int numberOfCars;//轨道缓冲数组int smallestCar;int numberOfTracks;//在...原创 2018-07-21 15:17:59 · 2248 阅读 · 0 评论 -
求解汉诺塔的递归问题
先上代码 void towersOfHanoi(int n,int x,int y,int z) {//把塔x顶部的n个碟子移到塔y //用塔z作为中转地 if(n>0) { towersOfHanoi(n-1,x,z,y); cout<<"Move top disk from tower"<<x<<"to top of ...原创 2018-07-21 11:08:19 · 229 阅读 · 0 评论 -
散列(hashing)
散列(hashing)是C++STL 字典实现的一种方式,散列的实现一般包括两个步骤: 1.将键值映射成一个整数。 2.将这个整数通过函数映射到一个线性表中 首先介绍第一个问题:怎么将键值映射成为一个整数 第一种转换法:int stringToInt(string s){//把s转换成一个非负整数,这种转换依赖s的所有字符int length=(int)s.length();...原创 2018-07-26 15:29:02 · 612 阅读 · 0 评论 -
括号匹配问题
给定一个字符串里面有很多括号,你怎么知道这些字符串是匹配的呢,还是随便写的呢?下面的程序将利用栈对括号进行匹配。void printMatchedPairs(string expr){ arrayStack<int> s; int length=(int)expr.size(); for(int i=0;i<length;i++) ...原创 2018-07-21 10:16:26 · 180 阅读 · 0 评论 -
声明
由于本人正在学习数据结构,所以一下代码大部分都来自c++数据结构算法与应用这本书。我只是在代码的基础上添加自己的理解,并作为笔记供以后复习。...原创 2018-07-15 19:24:19 · 172 阅读 · 0 评论 -
利用vector实现的基于数组的线型表
其实吧,怎么说呢。基于vector的线型表和基于数组的线型表其实是一个样子的,差别就在于,vector自带的函数功能强大一点,很多功能都不需要我们自己动手去实现,直接调用vector自带的函数就可以了。其实用vector就很好,如果没有特别的要求也没必要自己去实现一个template<class T>class vectorList:public linearList<T>...原创 2018-07-15 19:21:58 · 234 阅读 · 0 评论 -
C++迭代器
其实在一开始我觉得迭代器很麻烦,还不如[]符号好用,迭代器的遍历和读取,[]符号也能轻易的做到,为什么大家要设计迭代器这么个东西呢?书上给出的理由是:[]比迭代器更容易理解,但是迭代器更容易推广,以至可以输出任何具有迭代器的对象的元素。为了简化迭代器的开发和基于迭代器的通用算法的分类,C++的STL定义了5种迭代器,输入,输出,向前,双向和随机访问。所有迭代器都具备操符==,!=和解除引用符*。下...原创 2018-07-15 17:59:13 · 650 阅读 · 0 评论 -
c++arrayList的实现
数据结构:数据结构是一个数据对象,同时这个对象的实例以及构成实例的元素都存在这联系,而这些联系由相关的函数来规定。C++中存在着许多基本的数据类型,比如 int,bool 等,数据结构就是将这些基本数据类型通过函数和相应的规则组合起来形成新的数据类型。抽象类LinearList:template<class T>class linearList{ public: virtual...原创 2018-07-15 16:43:58 · 6321 阅读 · 0 评论 -
栈
栈:栈是一种特殊的线型表,其插入(也称入栈或压栈)和删除(也称出栈和谈栈)操作都在表的同一端进行。这一端称为栈顶,另一端称为栈底。其实栈就是一种被限制的线性表,栈的功能是之前线性表的子集,比如线性表能在任意地方进行插入,而栈只能在尾部进行插入。接下来实现一个数组描述栈: 1.派生自之前的arrayList:template&lt;class T&gt;class stack{ ...原创 2018-07-20 21:57:39 · 171 阅读 · 0 评论 -
队列
队列就是一种FIFO(先进先出)工作的线性表。 在一个分布式系统中,一个队列要为多个队列提供服务。一个具有m个服务器的分布式系统,具有m个服务器队列;一个队列服务于一个服务器。另外,有一个代理人队列。服务请求首先进入代理人队列;代理人按照FIFO方式检查代理人队列中的服务请求,然后把每一个请求送到最对口的服务器队列;服务器按照FIFO方式处理来自服务器队列的服务请求。...原创 2018-07-20 20:47:05 · 194 阅读 · 0 评论 -
稀疏矩阵(2)
这里用链表实现一个稀疏矩阵,不过只讲讲其实现原理。分两个步骤: 1. 把每行的非0元素串在一起,构成一个链表,称为行链表,在行链表中每一个节点有两个域:element(数据域)和next(指针域)。数据域element有两个子域:col(元素的列号),value(元素的值)。next指针指向改行的下一个非零元素。一行中至少有一个非零元素,才会建立该行的行链表。 2. 把所有的行链表的头节点...原创 2018-07-20 18:03:01 · 198 阅读 · 0 评论 -
二叉树的链表描述和遍历
二叉树用数组描述,当数据很少时非常浪费空间,所以一般都用链表描述。template<class T>struct binaryTreeNode{ T element; binaryTreeNode<T>* leftChild, *rightChild;//左子树和右子树。 binaryTreeNode() {leftChild=righ...原创 2018-07-27 15:33:01 · 655 阅读 · 0 评论 -
开关盒布线问题
什么是开关盒布线呢? 假如一个开关盒里面有十个接口,我们要连五条线,但是当我们规划完连线方式后,怎么判断这些线是不相交的呢?因为如果线相交那么线之间会相互影响,所以我们希望它们不相交。 以下是一个布线合理的例子。假如有十个节点1,2,3,4,5,6,7,8布线规划为(1,4),(2,3),(5,6),(7,8)。 我们首先创建一个栈,将1压入栈中,然后增序查找,首先找到2由于2和1不是一...原创 2018-07-23 09:45:17 · 1569 阅读 · 0 评论 -
动态规划
动态规划和贪婪算法是非常相似的,只是贪婪算法每一步都寻找当前情况下最好的下一步算法,选好了就不能改变,而动态规划每次执行下一步时都会重新规划之前的步数,保证当前步加上之前的步数的结果为最好。 下面我们将以01背包问题来介绍动态规划算法: 从前往后递推的动态规划算法请参考这篇博客: https://blog.youkuaiyun.com/Du_Shuang/article/details/81985214...原创 2018-08-24 14:16:33 · 468 阅读 · 0 评论 -
动态规划解决01背包问题
本文转载于Christal_R的博客园博客: https://www.cnblogs.com/Christal-R/p/Dynamic_programming.html一、问题描述:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?二、总体思路:根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条件、判断是否满足最优性原理、找大问题与小问...转载 2018-08-23 17:43:58 · 260 阅读 · 0 评论 -
分而治之算法
分而治之算法是一个我们生活中经常会用到的算法,当一个问题比较大时我们会将其分割为相同的几个小问题进行解决,因为小问题相同所以一个小问题的算法又能直接应用于其他小问题,所以分而治之经常用到的方法是递归。 下面将通过几个例子来介绍分而治之算法: 1.矩阵计算问题 矩阵A*B=C计算的一般方法是A的第i行元素乘以B的第j列元素得到C的第i行j列的元素。这样的方式虽然很简单,但是却要花费巨额的计算量...原创 2018-08-22 15:42:35 · 4427 阅读 · 0 评论 -
贪婪算法
虽然课后习题没写,但是这本书的数据结构部分总算是看完了。接下来开始算法部分。 首先简单的介绍贪婪算法:贪婪算法就是算法的每一步都是上一步条件下的最好选择。 比如梯度下降法就是一种贪婪算法,我们每次选出当前点梯度下降最快的方向作为我们下一步的方向。这种方法虽然能帮我们得到问题的解但却不是最优解,比如梯度下降法的到的路径就不是最短路径。 所以贪婪算法得到的是一个近似最优解。 下面将实现几个贪婪...原创 2018-08-16 13:36:20 · 3047 阅读 · 0 评论 -
图
图应该是计算机应用的一个比较重要的方向吧,数据结构与算法c++语言描述里面单独拿出一章用来讲图。 不过这本书讲的比较浅显且不全面,如果想深入的研究图的知识,建议去学习下图论,不过图论自学起来有点难,建议去大学蹭课。 下面给出有向加权图的二维矩阵实现方法:template<class T>class graph{ public: virtual ~grap...原创 2018-08-15 11:12:18 · 316 阅读 · 0 评论 -
图的应用
之前写了图的基本概念,现在写图的一般应用。 一.寻找一条路径 用广度优先搜索,虽然能很好的找到能到达的所有点,但是却不容易找到路径,而深度优先搜索里面隐含了路径,所以寻找路径一般用深度优先搜索。bool rFindPath(int s){//寻找路径的实际算法。从顶点s开始实施深度优先搜索//顶点s不应该等于终点//当且仅当一条路径找到了,返回truereach[s]=1;//...原创 2018-08-15 14:30:19 · 295 阅读 · 0 评论 -
二叉搜索树
二叉搜索树:是一颗二叉树,可能为空;一颗非空的二叉搜索树满足以下特征: 1.每个元素有一个关键字,并且任意两个元素的关键字都不同;因此所有的关键字都是唯一的。 2.在根节点的左子树中,元素的关键字(如果有的话)都小于根节点的关键字。 3.在根节点的右子树中,元素的关键字(如果有的话)都大于根节点的关键字。 4.根节点的左右子树也是二叉搜索树。有重复值的二叉搜索树:去除二叉搜索树中每个元...原创 2018-08-03 13:45:58 · 1014 阅读 · 0 评论 -
教你彻底学会动态规划——入门篇
本文转载于:https://mp.youkuaiyun.com/mdeditor 动态规划相信大家都知道,动态规划算法也是新手在刚接触算法设计时很苦恼的问题,有时候觉得难以理解,但是真正理解之后,就会觉得动态规划其实并没有想象中那么难。网上也有很多关于讲解动态规划的文章,大多都是叙述概念,讲解原理,让人觉得晦涩难懂,即使一时间看懂了,发现当自己做题的时候又会觉得无所...转载 2018-08-02 14:43:48 · 169 阅读 · 0 评论 -
赢者树应用之用最先适配法求箱子装载问题
1.箱子装载问题:箱子的数量不限,每个箱子的容量为binCapacity,待装载的物品有n个,物品i需要占用的箱子容量为objectSize[i]。所谓可行装载,是指所有物品装入箱子而不溢出。所谓最优装载是指使用箱子最少的可行装载。2.最先适配法(first fit,FF):物品按1,2,3,…n的顺序装入箱子。假设箱子从左到右排列。每个物品i放入可装载它的最左面的箱子。 最优适配法(b...原创 2018-08-02 11:43:33 · 969 阅读 · 0 评论 -
竞赛树之赢者树的实现
赢者树:有n个选手的一颗赢者树是一颗完全二叉树,它由n个外部节点和n-1个内部节点,每个内部节点记录的是在该节点比赛的赢者。 简单的说就是有一颗完全二叉树,从叶节点开始,左右两个子节点谁大(小),就把谁的值赋值给他们的父节点,然后父节点在和其兄弟节点进行比较将较大(小)者赋值给其父节点直到根节点,那么根节点的数据就是冠军。 注意:现实的竞赛所对应的树不一定都是完全二叉树,但是用完全二叉树能使比...原创 2018-08-01 17:05:42 · 2383 阅读 · 1 评论 -
箱子装载问题的最优匹配法
箱子最优匹配法:插入物品的时候优先插入可用空间容量最小且大于物品尺寸的箱子。 由于箱子的剩余容量可能相同,所以我们采用一颗带有重复关键字的二叉搜索树来描述箱子。 节点的键为箱子剩余空间的大小,假如我们要插入物体的尺寸大小为n,我们首先比较该n与根节点的键大小,如果n小于根节点大侠则将n设为候选箱子,然后再根节点的左子树里面继续进行寻找,如果n大于左子树根节点的键,那么就得在左子树根节点的右子树...原创 2018-08-06 12:00:39 · 4158 阅读 · 0 评论 -
使用搜索树的直方图
首先实现一个简单的直方图程序void main(){//非负整形的直方图int n,r;//元素个数n,元素最大值r。cout<<"Enter number of elements and range"<<endl;cin>>n>>r;//生成直方图数组int *h=new int[r+1];//将数组h初始化为0for(in...原创 2018-08-06 11:02:48 · 231 阅读 · 0 评论 -
并查集的树实现
在二叉树里面我们每个节点都有两个指针,一个指向左孩子,另一个指向右孩子,但是在并查集算法里面,一个父节点可能有很多个孩子,那我们该在每个节点设置多少个指针域呢? 答案是只放一个,并查集的查找是自下而上的,所以我们只需要在每个节点放置一个指向父节点的指针即可。这样一来是不是很像并查集的链表实现?不同的是链表是将这些节点串成了一串,而树则是众星拱月的形式。实际上链表并查集执行压缩路径算法后就是并查集...原创 2018-07-28 12:05:16 · 415 阅读 · 0 评论 -
稀疏矩阵
稀疏矩阵:一个m*n的矩阵,如果大多数元素都是0,则称为稀疏矩阵,一般规定稀疏矩阵的非0元素个数要小于n^2/3,有时还有小于n^2/5.下面来实现一个稀疏矩阵的实例: 稀疏矩阵实现的思想是把无规则稀疏矩阵的非0元素映射到一个线性表中。为了重建矩阵结构,必须记录每个非0元素的行号和列号,因此数组元素需要三个域:row,col和value。为此定义结构maxtrixTerm。templat...原创 2018-07-20 17:45:44 · 1288 阅读 · 0 评论 -
程序时间复杂度的测量
#include<time.h>int main(){ int a[1000],step=10; double clocksPerMillis=double(CLOCKS_PER_SEC)/1000; for(int n=0;n<=1000;n+=step) { long numberOfRepeatitions=0; clock_t startTime=cl...原创 2018-07-14 11:50:24 · 1294 阅读 · 0 评论 -
渐进计法
如果一个程序的复杂度为:1<f(n)<2*n那么我们可以说:f(n)=O(n)即f(n)的复杂度渐进的小于或者等于n. f(n)=Ω(1)即f(n)的复杂度渐进的大于或者等于1,即1是f(n)的下界。 f(n)=Θ(n)即f(n)的复杂度渐进的等于n。以上的三个就是我们经常要用的三个...原创 2018-07-14 11:18:23 · 366 阅读 · 0 评论 -
用队列实现列车车厢重排
之前写了用栈实现的列车车厢重排问题,现在来实现用队列的列车车厢重排问题,用队列要比用栈简单。void outputFromHoldingTrack(){//将编号最小的车厢从缓冲轨道移到出轨道 //从栈itsTrack中删除编号最小的车厢 track[itsTrack].pop(); cout<<"Move car"<<smallestCar<<...原创 2018-07-24 10:17:57 · 2272 阅读 · 0 评论 -
测试与调试
测试:用一组数据去测试代码,尽可能暴露出代码的错误。测试分为白盒法和黑盒法。黑盒法:把输入数据和输出数据分为若干类,不同类的数据使程序结果有质的不同。白盒法:白盒法分为分支覆盖和语句覆盖语句覆盖:要求程序的每一条语句都至少执行一次。分支覆盖:要求测试集能够使程序的每一个条件都分别取到true和false。从句覆盖:分支覆盖的加强版,如果一个分支为A||B&&那么从句覆盖要求A,B,...原创 2018-07-12 16:18:38 · 772 阅读 · 0 评论 -
STL常用的几个函数
1. accumulate(a,a+n,initialValue,operator)其中a指向首元素,a+n指向尾元素后一个元素,将首尾中间的元素按照operator(指定的算法比如相加)之后再加上initialValue之后再返回。2. copy(start ,end, to)将元素从位置start,start+1...end-1依次复制到位置to,to+1,...to+end-start。必将...原创 2018-07-12 15:31:30 · 394 阅读 · 3 评论 -
用递归实现全排列
有使用递归就必学满足两个条件:1:基础部分,即退出条件。2:递归部分,一步步走向基础部分。即要嘛基础部分,要嘛是在走向基础部分的路上。实现全排列也要满足以上两个条件。比如要对{a,b,c}进行全排列,可以将其分解为以下的几个全排列:a{b,c} b{a,c} c{a,b}而以上三个全排列右可以分解为以下的几个全排列ab{c} ac{b} ba{c} bc{a} ca{b} c...原创 2018-07-12 12:03:00 · 581 阅读 · 0 评论 -
队列
队列就是一种FIFO(先进先出)工作的线性表。 在一个分布式系统中,一个队列要为多个队列提供服务。一个具有m个服务器的分布式系统,具有m个服务器队列;一个队列服务于一个服务器。另外,有一个代理人队列。服务请求首先进入代理人队列;代理人按照FIFO方式检查代理人队列中的服务请求,然后把每一个请求送到最对口的服务器队列;服务器按照FIFO方式处理来自服务器队列的服务请求。...原创 2018-07-23 14:07:05 · 366 阅读 · 0 评论 -
并查集算法
想要弄明白什么是并查集首先要明白什么是等价类我们说关系R是一个等价关系当且满足以下条件:1.对于所有的a∈U,有(a,a)∈R时(关系是自反的)2.(a,b)∈R,当且仅当(b,a)∈R(关系是对称的)3.若(a,b)∈R且(b,c)∈R,则有(a,c)∈R(关系是传递的)比如R={(1,11),(7,11),(2,12),(12,8),(11,12),(3,13),(4,13),(13...原创 2018-07-17 18:17:03 · 246 阅读 · 0 评论 -
寻找迷宫路径
寻找迷宫路径其实就是遍历每一个可能的路径,碰到能够成功的路径就返回。bool findPath(){//寻找一条从入口(1,1)到达出口(size,size)的路径//如果找到,返回true,否则返回falsepath=new arrayStack<position>;//初始化偏移量position offset[4];offset[0].row=0;offset...原创 2018-07-23 11:35:40 · 762 阅读 · 0 评论 -
离线等价类问题
等价类是满足自反性,传递性的一组关系,其具有find和union两个方法。这之前我们已经说过了。 这里我们介绍的离线等价类是find的升级版本,find只找寻root,而离线等价寻找,一个等价类的所有元素。 其原理就是首先随便寻找一个等价类元素,然后利用传递性去把所有和他相关的元素找出来。int main(){ int n,//元素个数 r;//关系个数 ...原创 2018-07-23 10:36:57 · 1470 阅读 · 0 评论