计算-数据结构与算法
文章平均质量分 87
后台-计算-数据结构与算法
BLSxiaopanlaile
这个作者很懒,什么都没留下…
展开
-
求平方根的几种方式
求平方根的几种方式原创 2022-04-11 09:16:09 · 13829 阅读 · 0 评论 -
对于给定的数组,统计出其中最多的元素的值
/* 问题描述:对于给定的数组,统计出其中最多的元素的值(1,3,5,4,3,3,最多的是3) 说明:对于这个问题,简单的、一般的算法很容易想到(我想到的就是这个)。有点吊的算法使劲想想,应该也能想出来。最牛逼的是第三种算法,能想出来的估计应该算是大牛的级别了。本人绞尽脑汁想出了第一种算法,但男人的第六感告诉我总觉得有更好的方法。所以又查阅了相关资料,整理出来另外两种算法。特记录原创 2017-09-28 22:12:25 · 351 阅读 · 3 评论 -
单链表的相关操作
最近复习数据结构的时候,复习到了链表,把王道上的关于链表的基本操作敲了一遍,当是复习巩固,记录在此,没准以后能用得到。//结点类型typedef struct LNode{ int data; struct LNode *next;}LNode,*LinkList;//前插法建立单链表LinkList CreateList1(LinkList &L){ LNode原创 2017-10-07 21:56:24 · 293 阅读 · 0 评论 -
使用algorithm中的sort进行vector的自定义排序
/* 名称:使用algorithm中的sort进行vector的自定义排序 说明:可以使用sort进行自定义排序。不过要定义比较函数。在此处的比较 函数为Compare(名字可以任取)。在比较函数中,定义自己的排序方式。 然后在sort函数中传入函数名作为参数,sort就会按照我们定义的方式进行 排序。应该是返回true的方式。此方法对于对象中的属性原创 2017-04-07 21:04:12 · 1755 阅读 · 1 评论 -
名称:广度优先遍历
/* 名称:广度优先遍历 说明:广度优先遍历类似于树中的层次遍历,所以其需要使用到一个辅助的队列,用来保存接下来要访问的顶点顺序。其空间复杂度最高为O(V)。 其次,对于广度的优先遍历来说,其主要的时间也是花在访问当前结点的下一个结点上,所以对于用临接矩阵存储结构的图来说,其时间复杂度为O(V2)。对于临接表来说,时间复杂度为O(V+E)。具体的算法采用两种方式都原创 2018-01-07 21:19:23 · 256 阅读 · 0 评论 -
删除二叉树中以x为根的子树
/* 名称:删除二叉树中以x为根的子树 说明:此程序的大部分内容,注释都解释的较为详细了。在这里需要提及一点的是此处递归函数flag传递的不是上篇中讲的引用,而是普通的变量,因为在向下传递参数(当前结点是否是x的信息)的过程中只要传递给对应的子树,并不需要传递给整个树的结点。在下一篇会做个关于递归传递参数的总结。*///递归删除二叉树中以x为根的子树,(flag为标志)int原创 2017-11-11 22:19:20 · 7042 阅读 · 2 评论 -
查找之索引查找
/* 名称:索引查找(分块查找) 说明:本程序写的有不少问题,用的是STL,可能STL内部的机制不是很熟悉,一直没改成功先贴上来。以后有时间在重新修改吧。 对于索引查找来说,从某种程度上说,其是二分查找和顺序查找的一种折中。它要求有两个表一个索引表,每个索引表中的索引对应一个元素表(此处的索引即为对应元素表中元素的最大值)。还要求表间有序,表内无序。这样首先在索引表中查原创 2017-12-03 16:24:18 · 623 阅读 · 0 评论 -
双向链表L每次访问元素后,元素按访问频度递减次序排列
/* 问题描述:双向链表L(结点中含有fre频度),每次访问元素后,元素按访问频度递减次序排列 说明: 这个问题题非常向操作系统中应用的一些算法了,比如说涉及到内存、磁盘中数据的访问,换出等。这个链表中保存的是按照最近最常使用的顺序排列的。*/#include <iostream>using namespace std;typedef struct DNode{ in原创 2017-10-07 22:15:18 · 2007 阅读 · 0 评论 -
算法小题:最大子矩阵问题
目录前言问题描述解法一解法二总结前言这次想要总结的求数组(或者二维数组)之间的最优值还有最后一篇最大子矩阵问题。今天把它搞定。问题描述(选自牛客网)解法一按照正常人的思维水平,如果不是以前对相关知识有了解,首先冲向脑子的解法应该就是暴力遍历了。 你别说,这题暴力解法还真能A出来。不过要做一点小小的优化。 不多说,上代码。//暴力求解的主要代码for(i_min = 1;i_min<=n;++i_min) { for(int i_max = i_原创 2020-06-21 10:27:03 · 962 阅读 · 0 评论 -
顺序循环队列的基本操作
/* 名称:顺序循环队列的基本操作 说明:此处说明以下有关顺序循环队列的判断空,判断满的问题。此处采用的是少用一个存储元素。 此外,还可以采用增加一个标志位tag,即指示fro == rear是因为空还是因为满。 还有可以增加一个Q.size属性来判断是否达到空或者满的状态。*///顺序队列的存储结构typedef struct{ int data原创 2017-10-15 21:25:55 · 2349 阅读 · 0 评论 -
Java I/O流总结
字节流/* 名称:inputstream 说明:inputstream是字节流中的最基本的输入流,它是很多输入流的基本类,其不能直接实例化对象,因为它是个抽象类。但是可以将其子类的对赋给它(如本例中的system.in),通过多态来实现输入流。不过一般不直接用inputstream而是用其子类的fileinputstream、bufferinputstream等来实现。*/pa原创 2017-03-10 19:44:57 · 227 阅读 · 0 评论 -
已知满二叉树的先序遍历,求其后序遍历
/* 名称:已知满二叉树的先序遍历,求其后序遍历 说明:此处用的是递归,每次确定一个数的范围。*/stack<int> _sta; //全局栈,用来记录后序遍历。//已知满二叉树的先序遍历,求其后序遍历void PostWithPre(int pre[],int beg,int _end){ int length = _end - beg;原创 2017-12-03 16:28:05 · 2465 阅读 · 8 评论 -
算法小题:数组分割问题
数组分割前言问题描述思路分析解法一解法二解法三总结前言好了,今天来说说一个挺有意思的题-数组分割。其本质唯一,解法不少。问题描述如:思路分析乍一看,题目描述很简单,应该也不是很难。可思来想去半天,最终也只得出了应该使 A(两个数组中较小的数组和) 尽量接近SUM/2 (数组总和的一半) 这个结论。 很简单,看官应该都相当聪明,我这就不细说了。那还怎么解呢? 难道从小到大排序,然后往arr1子数组中放一个,在往arr2中放一个,同时控制着它们不要立平均数太远。好吧,这个思路我试过,但是最终原创 2020-07-11 10:09:39 · 854 阅读 · 0 评论 -
线性表描述(顺序表)及相关操作
最近在复习数据结构的时候,重新学习了线性表中的顺序表(数组)。作为练手,把它的一些基本操作实现了,以后可能用得到,现记录如下。//顺序表描述#define Maxsize 50typedef struct{ int data[Maxsize]; //直接分配 int length; //当前的长度}Sqlist;typedef struct{ int *d原创 2017-09-22 21:15:07 · 489 阅读 · 0 评论 -
C语言输入输出函数总结
/* 名称:C语言输入输出 说明:fputc(ch,fp):把字符ch写到fp制定的文件中。 fgetc(fp):返回一个从fp指向的文件中一个字符。 fgets(str,n,fp):从fp指向的文件中读取n-1个字符放到str中。 fputs(str,fp):将str中的字符串输出到fp指向的文件中原创 2017-04-02 21:16:08 · 785 阅读 · 0 评论 -
算法小题:最大连续子序列和问题
最大连续子序列和问题前言问题描述解法一分析代码解法二分析代码解法三分析代码解法三(番外版)分析代码实验结果前言刷题的时候遇到了这个最大连续子序列和的问题,查阅研究了一下。记录在此。希望能够便人便己。问题描述给定一个数组a[ n ] ,数组元素均为自然数集(有正数,有负数),请求出该数组一个连续的子序列,使得这个子序列的和值最大,示例如下a[] = {1, 2, -9, 5, 6, -3, 7, 8, -89, 10}那么它的最大连续子序列为 {5,6,-3,7,8} ,和值 = 23说明:偷原创 2020-06-12 19:19:18 · 2209 阅读 · 1 评论 -
算法小题:最长递增子序列
最长递增子序列前言问题描述解法一分析代码解法二分析代码总结前言ok,这两天又研究了关于最长递增子序列相关的一些内容。记录在此,希望便人便己问题描述求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的,即留“空”。例如:序列A: 4 2 3 1 5 的最长递增子序列为 2 3 5,长度为 3 。解法一分析这题其实和上次那个最大连续子序列和有点像,解法一的思路也和最大连续子序列和问题有些许联系。可以采用类似的解空间的思路。对于给定的一个求解序列来说,假定其最终的答案是b0,原创 2020-06-13 19:10:15 · 299 阅读 · 0 评论 -
C文件操作的定位
/* 名称:C文件操作的定位 说明:rewind(fp):将文件读/写指针移到文件的开始位置 fseek(fp,offset,whence):将文件读/写指针从whence标识的位置移动offset个字节 其中offset可以去负值代表向后移动,在此函数中,whence取0代表文件开头,2代表 当前位置,3代表文件末尾。原创 2017-04-02 21:17:21 · 519 阅读 · 0 评论 -
查找之Hash查找
/* 名称:Hash查找 说明:Hash查找本质上就是把元素的关键字和元素的存储位置建立了一个映射联系,这样使得元素可以通过关键字立即查找到相应位置。这是最快的查找方式。但是在进行映射时有两个问题需要解决: 1、哈希函数的构造(映射函数) 一般来说,哈希函数有以下几种常用的构造方式 (1)、直接定址法 (2)、除留余数法原创 2017-12-03 16:26:23 · 447 阅读 · 0 评论 -
判断两个二叉树是否相似
/* 名称:判断两个二叉树是否相似 说明:此处的两个方法一个是非递归,一个是递归算法。其实两个算法的本质思路是一样的就是,判断位置相同的两个结点是否同时为空或同时不为空。只是具体的实现不一样。对于层次遍历法:此处不小心用错了,本应该用队列来当作排列下一层元素的。歪打正着,此处用栈也可以,只是判断的结点顺序不一样。队列的话,是从每一层的左端到右端。栈的话,是从右端到左端。在此处都没影响原创 2017-12-03 16:30:06 · 9016 阅读 · 1 评论 -
非递归遍历后序二叉树
/* 名称:非递归遍历后序二叉树 说明:后序非递归遍历二叉树比起先序和中序来说要复杂一点,因为对于先序和中序来收栈中的元素只要有从子树(无论是左子树还是右子树)返回的,就可以把对应的元素从栈中push出来。但是后序不一样,它必须判断是否是从左子树还是右子树返回,如果是左子树的返回,则需要继续遍历其右子树。如果是右子树返回那么可以push出对应元素。复杂在此。本程序解决这个问题,采原创 2017-11-11 22:02:43 · 446 阅读 · 0 评论 -
递归删除链表中的指定元素x
/* 问题描述:递归删除链表中的x 说明:此处要注意的是,在递归删除x的时候,中间并没有产生断链。因为函数传递的是引用。 关于引用,这次又详细的查了一下。特说明如下:其实引用,在教材上被解释成别名。就是给变量另起一个名字。从本质上说,其实并没有引用这回事,引用的内部实现过程还是利用指针来实现的。 比如说:int i; int &j = i; 然后我们就可以说j原创 2017-10-07 22:01:58 · 2355 阅读 · 8 评论 -
名称:求最短路径
/* 名称:求最短路径 说明:本实验包括 1.利用广度优先遍历统计单源最短路径 2.迪杰斯特拉算法求解有向图的单源最短路径 3.弗洛伊德算法求解所有顶点之间的最短路径*/#include#include "graph.h"using namespace std;////访问标志数组(用作标记当前结点是否已访问)bool visited2[Max原创 2018-01-07 21:22:34 · 168 阅读 · 0 评论 -
矩阵相乘的两种方法
/////////// /* 名称:矩阵相乘的两种方法 说明:最近,在复习线性代数的时候,老师说到矩阵A*B,可以把B转化为一个个列向量b1,b2,b3分别与A矩阵相乘。这和我以前的想法不同,以前的想法都是按照标准公式A的第一行*B的第一列,然后相加。今天所认识的,虽然在计算机上计算过程并没有太大的区别,但在线性代数上可以更好的理解什么是线性变换(虽然我现在理解的还不是很深刻)原创 2017-06-26 20:51:25 · 12072 阅读 · 0 评论 -
树存储结构的几种表示方法
/* 名称:树存储结构的几种表示方法 说明:对于树的存储结构,一般有以下三种表示方法。 (1)、双亲表示法。这种存储方式采用一组连续的空间来存储每个结点,同时在每个结点中增设一个伪指针, 指示其双亲在结点中的位置。这种方式比较容易找到双亲,但是不容易找到孩子。 (2)、孩子表示法。这种方法是将每个结点的孩子结点都用链表链接起来形成一个线性结构。这种方式比较原创 2017-12-03 16:31:49 · 13104 阅读 · 0 评论 -
二叉树及其基本操作
/* 名称:二叉树及其基本操作 说明:最近重新学习了二叉树,多了一个纬度,我去难度可不是上升一个层次。磨磨蹭蹭慢慢悠悠的把基本操作敲完了。在此记录一下。*///二叉树的存储结构typedef struct BiTNode{ int data; //数据域 struct BiTNode *lchild,*rchild; //指针域}BiTN原创 2017-11-11 22:00:42 · 180 阅读 · 0 评论 -
名称:基数排序
/* 名称:基数排序 说明:基数排序本质上就是多关键排序。在王道中介绍的是通过分配和收集两种操作来达到排序的效果。它不是基于关键字比较的排序算法。但是,你说既然不比较如何能确定两个数的大小呢。其实啊,在我看来,在它分发的过程中已经包含了比较的操作。举个不恰当的例子,我把一些人分成富翁、富人、中产、穷人。虽然这些人没有进行直接的比较,但是通过划分阶级,在这个过程中已经暗含了比较。原创 2018-01-07 21:10:55 · 121 阅读 · 0 评论 -
交换排序---冒泡排序和快速排序
/* 名称:交换排序—冒泡排序和快速排序 说明: 对于冒泡排序来说,其相对来说简单些,每次比较把相邻的元素比较,把较小的移动到前面,总共比较n-1次。最终的时间复杂度为O(N2)。要注意一点的是,在编程实现冒泡排序的时候,如果某一趟排序时,元素之间并没有进行交换,则说明已经有序,则不用在进行接下来的排序。具体的做法是保存一个flag变量。冒泡排序是一个稳定的排序算原创 2018-01-07 20:58:41 · 221 阅读 · 0 评论 -
printf打印函数的原理浅析
printf的底层原理浅析前言 最近在学习linux内核的时候用到了自定义实现的printf,学习了一下,在此记录,希望有助于大家。 在C语言中,我们用到的最多的输出功能函数大概就是printf了。但以前只是调用C语言的库函数,具体printf是如何实现的呢?说到底两件事:(1)、函数变参(2)、格式解析 下面将简要介绍以上两点内容,最后附一个简单的printf例子。函数变参...原创 2020-03-16 20:55:48 · 5025 阅读 · 4 评论 -
输出二叉树中x的祖先结点,(二叉树中最多只有一个x)
/* 名称:输出二叉树中x的祖先结点,(二叉树中最多只有一个x) 说明:如果只是简单的找到指定结点的父节点有很多中方法,包括一直保存其父节点(也就是一直访问当前的子结点),使用递归,使用队列(层次遍历的思想)。但是在这里是需要找到x的所有的祖先节点,就稍微复杂一点了。在这里需要了解,对于二叉树的后序遍历(无论是递归还是非递归)来说,其对应的栈中一直保存着根节点到当前结点的一条路径原创 2017-11-11 22:21:30 · 3509 阅读 · 1 评论 -
名称:拓扑排序
/* 名称:拓扑排序 说明:对于拓扑排序来说,其针对的一般是AOV网。其基本的算法(本程序中实现的)类似于广度优先遍历只不过在遍历的时候要修改顶点的入度数量。当某个顶点的入度数量为0时,则说明可以输出其顶点,并把以此顶点为源点的弧删去(也就是以此弧为终点的顶点的入度数减1)。 在本程序中使用的是临接矩阵的结构,时间复杂度为O(V2)。实际上比较好的存储结构是用逆临原创 2018-01-07 21:24:03 · 125 阅读 · 0 评论 -
从一字符串中,提取以指定字符分隔的字符串数组
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦:Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传LaTex数学公式UML序列图和流程图离线写博客导入导出Markdown文件丰富的快捷键快捷键加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl原创 2017-02-23 20:49:20 · 4251 阅读 · 0 评论 -
java I/O流总结
*Java字符流总结:*/////////////////////* * 名称:reader and writer * 说明:这是输入流的抽象基类,它也是个字符流。所谓字符流就是系统会在字节流的基础上按照字符流所对应字节的长度进行提取。即在java中字符用两个字节表示,所以每次系统就会提取两个字节作为一个字符。在这里面用到了inputstreamreader相当于字节流变成原创 2017-02-26 20:22:32 · 266 阅读 · 0 评论 -
求二叉树的宽度
/* 名称:求二叉树的宽度 说明:此程序用的是层次遍历法。通过记录每一层的节点个数,在比较,得出最大一层的节点个数,即树的宽度。*///求树的宽度(层次遍历法)int WidthOfTree(BiTree T){ queue<BiTNode *> _que; int most_width = 0,temp_width = 0; //前者用来记录最大的宽原创 2017-12-03 16:16:13 · 910 阅读 · 0 评论 -
排序二叉树的建立、插入、删除、查找
/* 名称:排序二叉树的建立、插入、删除、查找 说明:对于排序二叉树来说,其创建、插入和查找的算法差不多。简单来说,就是小了往左,大了往右。 对于二叉排序树的删除来说,稍微要复杂一点,要分成基本的几种情况:即 (1)、删除的结点是叶子节点 (2)、删除结点只有左子树或者只有右子树 (3)、删除的结点既有左子树、又有右子树此外还要注意删除的结点是否是根节原创 2017-12-03 16:33:34 · 2408 阅读 · 2 评论 -
二维数组的几种表示方法
/* 名称:二维数组的几种表示方法 说明:常用的有以下几种二维数组的表示方法: (1)、第一种是普通的二维数组的表示方法。 (2)、第二种是用一维数组来表示二维数组,从显示的元素地址可以看出,二维数组和一维数组表示的二维数组在内存中的储存方式其实是一样的,不过使用二维数组看起来要简单些,只要不用进行地址转换。 (3)、第三种表示是用指针数组。原创 2017-04-30 21:55:24 · 25041 阅读 · 0 评论 -
求二叉树的高度
/* 名称:求二叉树的高度。 说明: (1)、这里Heigh0采用的求二叉树高度的方法本质上用的是非递归后序遍历的思想。基本的程序流程和非递归后序遍历差不多。在这里只能用后序遍历形成的二叉树,不能用先序或者中序,因为只有后序遍历的叉树在栈中,存放的才是一条从根节点到当前节点的路径,才可以用来计算根节点到当前结点的高度,从而判断出整个树的高度。(2)、Heigh1用的是队原创 2017-11-11 22:09:44 · 622 阅读 · 0 评论 -
排序之插入排序
/* 名称:直接插入排序、折半插入排序、希尔排序 说明:本程序比较了插入排序的几种方法。 (1)、直接插入排序: 其适用于顺序存储和链式存储的线性表。它的时间复杂度为O(N2),主要花在比较和移动元素上。(2)、折半插入排序: 这是在(1)中的方式上做了一点小改变,因为已经排序完成的序列是有序的(好像是废话) 所以每次比较时利用折半的方式,原创 2017-12-03 16:58:55 · 136 阅读 · 0 评论 -
名称:二叉树及其基本操作
/* 名称:二叉树及其基本操作 说明:最近重新学习了二叉树,多了一个纬度,我去难度可不是上升一个层次。磨磨蹭蹭慢慢悠悠的把基本操作敲完了。在此记录一下。*///二叉树的存储结构typedef struct BiTNode{ int data; //数据域 struct BiTNode *lchild,*rchild; //指针域}BiTNo原创 2017-10-15 21:31:15 · 255 阅读 · 0 评论 -
CCF 201403-2(窗口)
/* 名称:CCF 201403-2(窗口) 说明:今天闲着没事,做题CCF练练手。这题并不是很难,但过程中也遇到了一些问题主要是关于STL的使用的。虽然以前一直在用STL,但都是找到什么用什么(就像这题一开始用的是vector,虽然也能达到同样的目的,但效率不高),今天, 在此总结下:对于STL我们一般常用的是vector、deque、list、stack、queue这些(还用原创 2017-09-17 20:29:30 · 561 阅读 · 0 评论