![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 90
beichengll
这个作者很懒,什么都没留下…
展开
-
栈(ADT)
1.概念:栈是限制插入和删除只能在一个位置上进行的表 2.注意知识点: (1).后进先出的特点(LIFO) (2).存在某个元素位于栈顶,而该元素是唯一可见的元素。 (3).栈的两种实现方式 :数组、链表 3.栈的基本操作: 1、数组实现: (1).入栈(push)和出栈(pop)#include <stdio.h>#define maxsize 10typ原创 2017-07-05 21:21:57 · 566 阅读 · 0 评论 -
二叉查找树 例
1、二叉查找树:左子树的值小于根结点,右子树的值大于根结点的树 二叉查找树的中序遍历结果是从小到大的排序。 前面已经介绍了二叉查找树的基本操作,下面通过完整的代码来演示一下,会有助于更好的理解。 2、例:将数组{4,2,5,10,6,3,7,8,1,9}插入为二叉查找树,并按照前序、中序、后序遍历,再删除一个结点后中序遍历输出。最后销毁二叉查找树#include <stdio.h>#incl原创 2017-07-26 16:04:20 · 455 阅读 · 0 评论 -
无权最短路径
1、最短路径算法: (1)、单源最短路径问题:从某固定源点出发,求其到所有其他顶点的最短路径 单源最短路径又分为有全图和无权图两种,每一种又包括有向和无向的。(2)、多源最短路径问题:求任意两顶点间的最短路径2、单源最短路径问题—无权最短路径算法: 使用某个顶点s作为输入参数,我们想要找出从s到所有其它顶点的最短路径。我们只对包含在路径中的边数有兴趣,因此在边上不存在权。显然,这是赋权最短路径原创 2017-08-17 22:31:48 · 698 阅读 · 0 评论 -
51nod 1557(两个集合)
题目: 小X有n个互不相同的整数: p1,p2,…,pn 。他想把这些整数分到两个集合A和B里边。但是要符合下面两个条件。 · 如果x属于A,那么a-x也肯定属于A。 · 如果x属于B,那么b-x也肯定属于B。 判断一下是否存在一种方案来分配这些数字到集合A,B中。 注意:如果一个集合为空也是可以的。(数据结构,Hash,并查集,CodeForces)其实不是很原创 2017-08-11 18:17:43 · 448 阅读 · 0 评论 -
Dijkstra算法
1、Dijkstra算法:是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。这个算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。注意该算法要求图中不存在负权边。2、Dijkstra算法的思路:该算法主要是根据最短路径的不断更新,最后获得最短路径。在最开始确定起点和目的点,将起点的邻接点路径原创 2017-08-18 18:56:46 · 718 阅读 · 0 评论 -
Floyd算法
前言:在前面我们已经介绍了,最短路径问题总体上分为单源最短路径和多源最短路径,而Dijkstra算法是解决单源最短路径的方法,这里将要介绍的Floyd算法就是解决多源最短路径的算法。即解决任意两点之间的最短路径。很容易的,我们可以想到,将单源最短路径的算法对每两个结点进行一遍就得到了多源最短路径,但是这样计算是浪费时间和空间的,这样的计算的时间复杂度是T =O( |V|3 + |E|*|V|);原创 2017-08-19 15:23:11 · 505 阅读 · 2 评论 -
最小生成树--Prim算法和Kruskal算法
1、最小生成树:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。最小生成树包括三个重要的性质: 最小:边的权重和最小 生成:最小生成树是从原树生成的,包含所有顶点,|v|-1条边都在图里 树:最小生成树还必须是一棵树,无回路,V个顶点一定有|v|-1条边。 最小生成树是连通的,而连通的图一定有一个最小生成树,这是充分必要的。原创 2017-08-19 16:10:45 · 2315 阅读 · 0 评论 -
散列、散列函数、冲突处理
1、散列:理想的散列表数据结构只不过是一个包含有关键字的具有固定大小的数组。典型情况下,一个关键字就是带有相关值的字符串。2、散列的基本思想:以关键字key为自变量,通过一个确定的函数 h(散列函数),计算出对应的函数值h(key),作为数据对象的存储地址。3、冲突:可能不同的关键字会映射到同一个散列地址上, 即h(keyi) = h(keyj)(当keyi ≠keyj),称为“冲突(Collisi原创 2017-08-04 17:20:03 · 1932 阅读 · 0 评论 -
平衡二叉树(AVL树,AVL树旋转)
1、平衡因子(BF):BF = HL - HR(其中HL和HR分别是左子树和右子树的高度)。2、平衡二叉树(AVL树):对于任一结点,左右子树的高度差的绝对值是小于1。 即 |BF|<=1。例:1、 对于3这个结点来讲,左子树高度为2,右子树高度为0,左右子树高度差为2,2>1,所以该树不是平衡二叉树。2、 对于这个树里面的每一个结点来讲,左右子树的高度差都小于等于1,所以原创 2017-07-29 10:18:43 · 4255 阅读 · 0 评论 -
树(树,二叉树,二叉查找树)
1.定义: n(n≥0)个结点构成的有限集合。当n=0时,称为空树2.对于任一棵非空树(n> 0),它具备以下性质: (1)、树中有一个称为“根(Root)”的特殊结点,用 r 表示; (2)、其余结点可分为m(m>0)个互不相交的有限集T1,T2,… , 其中每个集合本身又是一棵树,称为原来树的子树。3.树的一些性质: (1)原创 2017-07-22 19:33:16 · 250 阅读 · 0 评论 -
拓扑排序
1、拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在Vi到Vj的路径,那么在排序中Vj出现在Vi的后面。在讲解拓扑排序之前,我们先介绍一个概念,AOV网: 通常,我们把顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。 2、拓扑排序的步骤: 由AOV网构造拓扑序列的拓扑排序算法主要是循环执行以下两步,直到不存在原创 2017-08-17 18:00:35 · 5309 阅读 · 0 评论 -
堆(优先队列,最大堆的基本操作,堆的例题)
1、堆(优先队列):是一种特殊的“队列”,取出元素的顺序是 依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。2、堆的特性: (1)结构性:用数组表示的完全二叉树(堆一定是完全二叉树);(2)有序性:任一结点的关键字是其子树所有结点的最大值(或最小值)“最大堆(MaxHeap)”,也称“大顶堆”:任一结点的关键字是其子树所有结点的最大值。 “最小堆(MinHeap)”,也称“小原创 2017-07-29 15:13:03 · 1408 阅读 · 0 评论 -
堆排序
1、堆排序(Heap Sort):是指利用堆这种数据结构所设计的一种排序算法。2、堆分为”最大堆”和”最小堆”。最大堆通常被用来进行”升序”排序,而最小堆通常被用来进行”降序”排序。 两者基本上是类似的,在这里就只介绍最大堆的升序排序。3、最大堆的升序排序主要代码://向下过滤的函数 void maxheap_down(int a[], int start, int end){ int原创 2017-07-29 16:58:14 · 271 阅读 · 0 评论 -
Hash表实现
在前面已经介绍了平方探测法的概念以及基本思想,下面是平方探测法实现的部分代码:#define MAXTABLESIZE 100000 /* 允许开辟的最大散列表长度 */#include #include #include typedef int ElementType; /* 关键词类型用整型 */typedef int Index; /* 散列地址类型原创 2017-08-08 12:34:22 · 315 阅读 · 0 评论 -
不相交集(并查集)
1、不相交集是一种解决等价问题的有效数据结构,这种数据结构实现起来非常简单,每个例程只要几行代码,而且可以使用一个简单的数组实现。实现也非常快,每种操作只需要常数平均时间。2、等价关系 等价关系必须满足下面三个性质: (1):自反性,对于集合S中的任意元素a,a R a;(R为定义的关系,比如R为<=, >=等等) (2);对称性,a R b当且仅当b R a (3):传递性,若a R原创 2017-08-09 15:06:33 · 2717 阅读 · 0 评论 -
图的存储
其实关于图的很多相关术语,我们在离散数学的学习中就已经学过了,所以这里只是写一些比较重要和新的东西。1、图:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 需要注意的是: !有向边的顶点对用<>表示,无向边的顶点对则是用()表示。 !在这里的学习中,我们讲解的图全是简单图,即不考虑重边和自回原创 2017-08-16 16:24:08 · 204 阅读 · 0 评论 -
深度优先搜索和广度优先搜索( DFS&BFS )
1、深度优先搜索:图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。简称DFS它的思想: (1)、首先选择一个入口,标记,再访问邻接的元素,标记,一直下去,直到没有路可走。 (2)、然后按照原路返回,看到没有被标记的地方就访问并且标记上,知道所有元素都被标记。 (3)、注意要原路返回,不然可能会存在有的元素没有访问到然而已经退出的情况。 在这个图中,若选择原创 2017-08-16 20:41:06 · 3763 阅读 · 0 评论 -
队列(数组实现和链表实现)
1.概念:具有一定操作约束的线性表 2.特点:(1)只能在一端插入(入队),另一端删除(出队)。 (2).先进先出。 3.存储实现方式:数组、链表。 4.基本操作: 1.数组实现(循环数组): 注意:(1)、普通的顺序存储的数组用来实现队列时,存在一个问题:当rear(记录队尾的变量)到达maxsize-1时,不能确定队列是否满,因为前面可能原创 2017-07-16 19:43:43 · 1277 阅读 · 0 评论 -
排序(插入排序,希尔排序,归并排序,快速排序)
1.插入排序:每一步将一个待排序的元素按照其关键字值的大小插入到已排序序列的适当位置,知道待排序元素插入完为止。(1).核心代码:void sort(int a[],int n)//插入排序 { int i,j; int temp; for(i = 0;i<n;i++) { int j = i; int temp = a[i];原创 2017-07-22 16:41:16 · 375 阅读 · 0 评论 -
QT计算器 之 大数运算
1、简介: 计算器是我们生活中很常见的东西,它可以由多种语言多种方式来实现,今天我想讲的是基于C++语言,由QT实现的可以计算大数的简单计算器。2、作品演示: (1)简单四则运算 (2)大数运算3、重点原理讲解 (1)四则运算如何实现 (2)大数的加减乘除4、代码主体框架1个主函数; 两个类: 一个calculator类,实现了对界面的布局,其实这个布局很简单,就设置原创 2019-08-05 13:48:58 · 1319 阅读 · 0 评论