数据结构
文章平均质量分 72
Mekeater
梦想似乎很遥远,但我愿用一生去追逐。
展开
-
无向图最小生成树的Prim算法实现
无向图最小生成树的Prim算法实现前言本文讲解最小生成树的定义及实现原理,并根据最小生成树原理介绍贪心算法,以及讲解在贪心算法基础上延伸出来的Prim算法的思想及代码实现。零、无向图的约定为了更好理解最小生成树,假设采用的图是连通图,并且图中所有边的权重不一样。一、生成树定义图的生成树是它的一棵含有其所有顶点的无环连通子图,一幅图的生成树可以有很多。二、最小生成树定义最小生成树是图的所有生成树中的一棵权值(树中所有边的权重之和)最小的生成树三、生成树性质用一条边接树中的任意两个顶点都会原创 2021-06-03 23:18:57 · 2896 阅读 · 1 评论 -
加权无向图数据结构实现
加权无向图数据结构实现前言在数据结构专题中,已经讲了无向图的数据结构实现、无向图的搜索算法、无向图的路径查找算法及有向图的相关算法。不论之前文章讲解的无向图还是有向图,图中的边仅仅是存储了边依赖的两个顶点,并没有其它信息。但现实生活中边不仅仅是起止点那么简单,还需要知道起止点的长度、花费的时间等等信息。本文讲解的加权无向图,就是在边存储两个顶点的同时,再额外存储这条边的权重(即额外数据)。一、加权无向图边的实现实现思路:边存储两个顶点的同时,还需要存储边上的权重。代码实现/** * 加权无原创 2021-05-27 22:56:46 · 616 阅读 · 1 评论 -
有向图拓扑排序
有向图拓扑排序前言本文介绍有向图拓扑排序算法的思路及代码实现,首先讲解什么是拓扑排序,其次介绍实现拓扑排序需要的检测有向图是否有环的算法及顶点排序算法,最终实现有向图的拓扑排序。一、什么是拓扑排序?给定一副有向图,将所有的顶点排序,使得所有的有向边均从排在前面的元素指向排在后面的元素,此时就可以明确的表示出每个顶点的优先级。如对下图进行拓扑排序:拓扑排序结果为:根据拓扑排序的概念,如果对有向图进行拓扑排序,那么图中必须没有环,否则,就不能进行拓扑排序,然后在图中无环的情况下,再进行顶点排原创 2021-05-27 22:18:27 · 13036 阅读 · 0 评论 -
图的搜索算法
图的搜索前言在很多情况下,我们需要遍历图,得到图的一些性质,例如,找出图中与指定的顶点相连的所有顶点,或者判定某个顶点与指定顶点是否相通,是非常常见的需求。本文讲解图的深度优先搜索和广度优先搜索两种搜索的思想以及代码实现。一、深度优先搜索1. 搜索思路在搜索时如果遇到一个结点既有子结点,又有兄弟结点,那么先找子结点,然后找兄弟结点。此处,兄弟结点可以理解为邻接表中的结点,子结点可以理解为邻接表中结点的邻接表中的结点。简而言之,搜索与一个顶点相连接(不必直接连接)的顶点,是认准一个顶点一搜到底原创 2021-04-25 21:37:21 · 4961 阅读 · 0 评论 -
有向图的相关术语及实现
有向图的相关术语及实现前言本文介绍什么是有向图,有向图的相关术语及有向图基于邻接表存储结构的代码实现。一、什么是有向图有向图是一副具有方向性的图,是由一组顶点和一组有方向的边组成的,每条方向的边都连着一对有序的顶点。二、有向图的相关术语出度:由某个顶点指出的边的个数称为该顶点的出度。入度:指向某个顶点的边的个数称为该顶点的入度。有向路径:由一系列顶点组成,对于其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点。有向环:一条至少含有一条边,且起点和终点相同的有向路径。一副有向图中原创 2021-04-28 22:56:07 · 442 阅读 · 0 评论 -
基于无向图的路径查找算法
基于无向图的路径查找算法前言在实际生活中,地图是我们经常使用的一种工具,通常我们会用它进行导航,输入一个出发城市,输入一个目的地城市,就可以把路线规划好,而在规划好的这个路线上,会路过很多中间的城市。这类问题在图数据结构中就是:从s顶点到v顶点是否存在一条路径?如果存在,请找出这条路径。本文就来解决如果在图中查找路径的算法。一、路径查找算法思想遍历图中与指定顶点s相连的所有顶点,并记录顶点s到其它每个顶点的路径。本算法采用较简单的深度优先搜索遍历算法,添加了edgeTo[]整型数组,这个整型数组会原创 2021-04-25 23:30:52 · 2234 阅读 · 1 评论 -
图的入门及无向图的实现
图的入门及无向图的实现前言数据结构分为逻辑结构和物理结构,从逻辑结构上,数据结构分为集合结构(数据元素之间没有关系)、线性结构(数据元素之间存在一对一的关系)、树形结构(数据元素之间存储一对多的关旭)和图形结构(数据元素之间存在多对多的关系);从物理结构上,数据结构分为顺序结构(把数据元素放到地址连续的存储单元里面)和链式结构(把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的也可以是不连续的)。本文讲解数据结构中最后一种结构------图形结构,首先介绍图的基本概念,然后介绍图的存储结构,最原创 2021-04-25 16:41:20 · 594 阅读 · 1 评论 -
并查集实现思想优化及代码实现
并查集实现思想优化及代码实现前言并查集是一种树型的数据结构 ,并查集可以高效地进行如下操作:(1)查询元素p和元素q是否属于同一组(2)合并元素p和元素q所在的组。本文对并查集的的实现思路不断优化,提出3种并查集的实现思想,最后一种是并查集最优的实现思想,并对3种实现思想进行代码实现。一、并查集实现思想一1. 整体实现思想不通过树的思想进行实现,仅仅依据数组进行实现 (本质就将每个数组作为一组,然后通过一个辅助数组分别将不同组标识为辅助数组中不同的值)将所有组的元素用连续索引标识,如两原创 2021-04-25 15:27:25 · 223 阅读 · 0 评论 -
平衡树之红黑树思想及实现
平衡树之红黑树思想及实现前言之前我们学习过二叉查找树,发现它的查询效率比单纯的链表和数组的查询效率要高很多,大部分情况下,确实是这样的,但不幸的是,在最坏情况下,二叉查找树的性能还是很糟糕。例如我们依次往二叉查找树中插入9,8,7,6,5,4,3,2,1这9个数据,那么最终构造出来的树是长得下面这个样子:我们会发现,如果我们要查找1这个元素,查找的效率依旧会很低。效率低的原因在于这个树并不平衡,全部是向左边分支,如果我们有一种方法,能够不受插入数据的影响,让生成的树都像完全二叉树那样,那么即使在最原创 2021-04-16 23:12:31 · 412 阅读 · 0 评论 -
最小索引优先队列思路及实现
最小索引优先队列思路及实现前言堆是通过数组实现的完全二叉树结构,堆可以分为最大堆(父结点比左右子结点都大)和最小堆(父结点比左右子结点都小)。基于最大堆可以实现最大优先队列,基于最小堆可以实现最小优先队列。但是无论是堆,还是最大优先队列,还是最小优先队列,一旦结构形成,它们可以分别快速访问到队列中最大元素和最小元素,但是他们有一个缺点,就是没有办法通过索引访问已存在于优先队列中的对象,并更新它们。为了实现这个目的,在优先队列的基础上,学习一种新的数据结构,索引优先队列。本文以最小索引优先队列(即,以最小原创 2021-04-13 21:17:26 · 708 阅读 · 1 评论 -
堆排序思想及代码实现
堆排序思想及代码实现前言对于一个数组,如果要实现数组中元素从小到大进行排序,此时这种需求就可以利用堆排序进行实现。本文讲解如果利用堆排序实现数组元素从小到大进行排序。一、实现步骤1.构造堆;2.得到堆顶元素,这个值就是最大值;3.交换堆顶元素和数组中的最后一个元素,此时所有元素中的最大元素已经放到合适的位置;4.对堆进行调整,重新让除了最后一个元素的剩余元素中的最大值放到堆顶;5.重复2~4这个步骤,直到堆中剩一个元素为止。二、构造堆1.由数组构造堆的思路一堆的构造,最直观的想法就是另原创 2021-04-10 11:43:56 · 307 阅读 · 0 评论 -
堆的定义及其实现
堆的定义及其实现前言堆是计算机科学中一类特殊的数据结构的统称,堆通常可以被看做是一棵完全二叉树的数组对象。本文讲解堆增删的基本思路和具体代码实现。一、堆的特性1.它是完全二叉树,除了树的最后一层结点不需要是满的,其它的每一层从左到右都是满的,如果最后一层结点不是满的,那么要求左满右不满。2.它通常用数组来实现。具体方法就是将二叉树的结点按照层级顺序放入数组中,根结点在位置1,它的子结点在位置2和3,而子结点的子结点则分别在位置4,5,6和7,以此类推。3. 堆中树的某个结点的父结点与左右子结原创 2021-04-10 11:01:22 · 1030 阅读 · 0 评论 -
二叉树解决折纸问题
二叉树解决折纸问题前言请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时 折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2 次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一 个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向 例如:N=1时,打印: down;N=2时,打印: down down up一、折纸问题转为二叉树我们把对折后的纸张翻过来,让粉色朝下,这时把第一次对折原创 2021-04-08 23:07:09 · 638 阅读 · 0 评论 -
二叉查找树的创建及遍历
二叉查找树的创建及遍历前言对于线性表,或者符号表,无论是利用数组实现,还是链表实现,都不能达到比较完美。基于数组实现的顺序表,查询快(内存连续,通过索引即可查询),但增删慢(需要大量的数据移动);基于链表实现,查询慢(每次查询都要从头结点找起),但增删快(没有数据移动的操作)。但是,树的特性可以弥补线性表中的不足。顺序表天生查询快,增删慢,可以结合树的特性使其增删加快;链表天生增删快,查询慢,可以结合树的特性使其查询加快。本文讲解什么是树、什么是二叉树以及树的一些相关术语,并介绍二叉查找树的创建与原创 2021-04-08 09:32:50 · 730 阅读 · 0 评论 -
栈解决括号匹配和后缀表达式的计算问题
栈解决括号匹配和后缀表达式的计算问题前言存储货物或供旅客住宿的地方,可引申为仓库、中转站 。例如我们现在生活中的酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈。我们把生活中的栈的概念引入到计算机中,就是供数据休息的地方,它是一种数据结构,数据既可以进入到栈中,又可以从栈中出去。一、栈栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈原创 2021-04-05 10:29:24 · 336 阅读 · 1 评论 -
循环链表解决约瑟夫问题
循环链表解决约瑟夫问题前言传说有这样一个故事,在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,第一个人从1开始报数,依次往后,如果有人报数到3,那么这个人就必须自杀,然后再由他的下一个人重新从1开始报数,直到所有人都自杀身亡为止。然而约瑟夫和他的朋友并不想遵从。于是,约瑟夫要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,从而逃过了这场死亡游戏 。一、循环链表循环链表,顾名思义原创 2021-04-03 16:33:08 · 3272 阅读 · 0 评论 -
链表快慢指针的应用
链表快慢指针的应用前言快慢指针指的是定义两个指针,这两个指针的移动速度一块一慢,以此来制造出自己想要的差值,这个差值可以让我们找到链表上相应的结点。==一般情况下,快指针的移动步长为慢指针的两倍。==本文讲解利用快慢指针解决几个问题的思路,具体diam实现采用Java语言。单向链表节点Node设计 private class Node { //存储元素 public T item; //指向下一个节点 public Node ne原创 2021-04-03 15:12:57 · 245 阅读 · 1 评论 -
六种常见排序算法分析与实现
6种常见排序算法分析与实现前言本文讲解常见排序算法的分析与实现,具体包括冒泡排序;选择排序;插入排序;希尔排序;归并排序;快速排序;算法实现采用Java和C++两种语言。一、冒泡排序二、选择排序三、插入排序四、希尔排序五、归并排序六、快速排序...原创 2021-03-31 22:45:33 · 1058 阅读 · 1 评论 -
经典数据结构深入理解(大道至简)(一)
数据结构深入理解(大道至简)前言本文并不会详细的讲解各种数据结构的具体实现,而是通过尽量简洁的语句来概括这种数据结构存在的意义。一、链表链表就是为了解决数组的内存空间必须连续,而导致数据的插入和删除操作花销很大的问题而存在的一种内存空间不必连续的数据结构。链表在C++和C等语言中是通过指针来实现。那么诸如BASIC和FORTRAN等许多语言都不支持指针,就需要用普通数组代替指针实现两个重要功能1.每一个结构体含有数据和指向下一个结构体的方法、2.新的结构内存的分配(malloc),和结构体内存原创 2021-03-27 08:49:59 · 350 阅读 · 2 评论 -
二叉树的非递归中序遍历
二叉树的非递归中序遍历基本思想:从根结点一直向左走,走的过程入栈,直到左子树为空则访问;然后退栈,查看是否有右指针,若有则以其为根再找最左下结点,否则访问结合上篇二叉链表BiTNode *GoFarLeft(BiTree* T,SqStack *S){ if (!T) { return NULL; } while(T->lchild) { Push(S,*T);...原创 2019-03-13 15:15:42 · 490 阅读 · 0 评论 -
二叉树的存储结构及基本操作代码实现
二叉树的存储结构及基本操作代码实现前言二叉树是一种非线性结构,它在计算机中的存储方式和线性结构一样,也有顺序存储映像和链式存储映像一、二叉树的顺序存储表示1、用一组地址连续的存储单元,依次自上向下,自左向右存储二叉树上的结点元素2、该结构适合于完全二叉树,但是对于任意二叉树,势必会造成大量的内存浪费,如下所示的非完全二叉树的顺序存储结构,可见浪费了很多内存。最坏的情况是,深度为k的树,只...原创 2019-03-13 15:10:50 · 5147 阅读 · 0 评论 -
数据结构之线性表(一)
数据结构之线性表1、基本概念2、可以依据线性表抽象数据类型的基本操作。进行更复杂的操作,例如将线性表B合并到线性表A中;将线性表A,B按照一定顺序合并到C中。后续我会利用数组代替简单线性表,利用C语言实现上述操作...原创 2019-01-20 11:25:31 · 243 阅读 · 0 评论 -
数据结构之线性表的顺序表示和实现
线性表的顺序表示和实现前言:本博文中的代码环境为VS2012,如何在VS2012中编写C程序,在我的【开发工具】类别有讲解,点击访问一、用数组定义线性表的顺序映象#define list_init_size 100 //线性表存储空间初始分配量typedef int ElemType;//为int类型定义别名ElemType/*线性表的顺序存储结构*/typedef struct se...原创 2019-02-28 21:25:00 · 1538 阅读 · 0 评论 -
线性表的链式存储结构基本操作代码实现
线性表的链式存储结构基本操作代码实现一、创建单链表:从表尾到表头逆向创建bool CreateList_L(LinkList L,int n){ printf("------创建链表开始------\n"); LinkList p; for (int i=n;i>0;i--) { printf("输入第%d个结点数据\n",i); p=(LinkList)malloc(...原创 2019-03-02 17:35:59 · 6273 阅读 · 0 评论 -
合并两个链表
前言:合并操作用到基本操作在本篇文章有代码一、合并两个链表void Listunion(LinkList La,LinkList Lb){ printf("------合并两链表开始------\n"); ElemType *eb=(ElemType*)malloc(sizeof(ElemType)); int LenA=ListLength(La); int LenB=ListLe...原创 2019-03-02 20:10:59 · 1225 阅读 · 1 评论 -
数据结构之栈的实现
数据结构之栈的实现前言:对于栈我们只需要明白以下几点即可:1、栈是一个线性表2、栈只能在表尾(成为栈顶)进行删除和插入(表头称为栈底)3、栈的特征是后进先出4、栈的实现也有顺序存储结构和链式存储结构之分5、顺序栈的实现要注意,栈顶指针始终在栈顶元素的下一个位置一、栈的顺序存储结构的基本操作实现代码如下:// 栈.cpp : 定义控制台应用程序的入口点。//#include ...原创 2019-03-06 10:46:11 · 250 阅读 · 0 评论 -
数据结构之链表创建一元多项式,求一元多项式之和
数据结构之链表创建一元多项式,求一元多项式之和前言对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,…,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式:利用上述线性表将存储为S(1,0,0,0,0,…,3,…,2);这样的结构显然对内存造成浪费为了解决以上问题,可以将上面的线性表改善为P((a1,e1),(a2,e2),…,(am,em))只存...原创 2019-03-03 15:41:43 · 4701 阅读 · 0 评论 -
数据结构之链队列的基本操作的代码实现
数据结构之链队列的基本操作的代码实现前言:对于链队列只需要明白以下几点:1、队列也是一个线性表2、队列只能在一端插入(称为队尾),而另一端删除(称为队头)3、队列的特点是先进先出4、队列既然是线性表就也有两种存储结构(顺序存储结构,链式存储结构)5、用链表表示的队列称为链队列6、链队列的存储结构包括队头指针和队尾指针一、队列的链式存储结构基本操作实现代码// 队列.cpp : ...原创 2019-03-06 12:23:50 · 1764 阅读 · 0 评论 -
数据结构之循环队列
数据结构之循环队列前言:关于循环队列需明白以下几点:1、循环队列是队列的顺序存储结构2、循环队列用判断是否为空利用 Q.front=Q.rear3、循环队列头指针始终指向队列头元素,而尾指针始终指向队列尾元素的下一个位置4、按照队列的定义,队头删除,队尾插入,在这里插入图片描述会导致队头之前可能有空余的内存空间(如下图J1,J2出队后,空间被浪费),为了解决该问题,提出循环队列的解决方...原创 2019-03-06 15:35:54 · 14728 阅读 · 3 评论 -
二叉树的几种遍历方法
二叉树的几种遍历方法前言二叉树有三条搜索路径:分别是先上后下、先左后右的按层次遍历;先左子树后右子树的遍历;先右子树后左子树的遍历;按层次遍历比较简单,在此不做介绍,后两种遍历操作类似,在此我们只介绍先左子树后右子树的遍历。1、根据二叉树的递归定义,我们知道二叉树由根结点和左右子树构成,确定了先遍历左子树再遍历右子树之后,根据根结点在遍历中的次序分为:先序遍历(根结点在左右子树之前访问);中...原创 2019-03-13 22:08:31 · 3095 阅读 · 0 评论 -
树的三种存储结构
树的三种存储结构一、双亲表示法用一组连续的空间存储树的结点。每个节点中,除了有数据域,还附加一个指示数,指向其双亲结点在链表中的位置/************************************************************************//* 树的双亲表示存储结构 ...原创 2019-03-13 23:18:35 · 2488 阅读 · 0 评论 -
森林和二叉树的相互转换
森林和二叉树的转换原创 2019-03-14 07:52:44 · 4566 阅读 · 0 评论 -
树和森林的遍历
树和森林的遍历一、树的遍历树的结构是一个根加上森林,而森林又是树的集合,由此我们可以引出树的两种遍历方式(这两种遍历方式本身也是一种递归定义)。1、先根(先序)遍历:即先访问树的根结点,然后依次先根遍历根的每棵子树2、后根(后序)遍历:即先依次后根遍历根的每棵子树,然后访问根结点3、另外还有一种层序遍历,这种遍历就是自上向下,自左向右按层次进行遍历即可根据上面的两种遍历定义可得上图树...原创 2019-03-14 08:30:25 · 8494 阅读 · 5 评论 -
图的基本概念
图的基本概念前言树和线性表的联系与区别:1、树和线性表都有唯一的第一个元素2、线性表有一个最后元素,而树有多个最后元素3、线性表是一对一,而树是一对多图就是比较复杂的一种结构:1、图上任意两个顶点之间都可能发生关系,因此顶点之间的联系不像线性表和树一样只需要一个关系即可表示,它需要一个关系集合来表示顶点之间的关系2、图中任意顶点都可以看作第一个顶点3、图中的数据元素称为顶点,图是...原创 2019-03-15 08:25:31 · 314 阅读 · 0 评论 -
数据结构之串的定长顺序存储表示
数据结构之串的表示和实现一、前言1、串又称为字符串是由零个或者多个字符组成的有限序列2、串相等:需要满足串的长度相同,且各个对应位置的字符都相等3、串值必须用一对单引号括起来,但单引号本身不属于串(其作用是避免与变量名或者数的常量混淆而已)4、串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集,而线性表的数据对象为单个元素。然而,串的基本操作和线性表有很大差别5、串类型的...原创 2019-03-12 07:16:57 · 7584 阅读 · 1 评论 -
串的堆分配存储表示
串的堆分配存储表示前言1、串的定长顺序存储结构的缺点是限定了串的长度,若超出长度则约定截断2、堆分配存储表示解决上上面的问题,它动态分配串值得存储空间3、串值共享的存储空间称之为堆,它由C语言的动态分配函数malloc和free管理一、该结构最小操作子集代码实现如下在这里插入代码片...原创 2019-03-12 11:51:09 · 7477 阅读 · 1 评论 -
模式匹配的一种改进算法--KMP算法
模式匹配的一种改进算法–KMP算法前言:对于KMP算法我们需要清楚以下几点:1、常规算法由于主串位置的回溯,导致匹配算法的最坏时间复杂度为O(m*n)2、KMP算法的特点就是避免主串位置的回溯,通过next[j]函数值仅仅移动模式串的位置即可,它的时间复杂度位O(m+n)3、next[j](j为模式串T的位序)通过递推求得,规定:next[0]=0;当T[j]=T[next[j]]时...原创 2019-03-12 19:51:17 · 1103 阅读 · 0 评论 -
树和二叉树的基本概念
树和二叉树的基本概念一、树1、树型结构是一类非线性结构2、树是n(n>=0)个结点的有限集3、树有且仅有一个根(root)结点,其余互不相交的集合称为根的子树4、有向树有确定的根,且树根和子树之间为有向关系(我们一般讨论有向树)5、有序树和无序树的区别是子树之间是否有次序关系(我们一般讨论的是无序树)6、树的结点=数据元素+若干指向其子树的分支7、结点的度:结点拥有的子树数...原创 2019-03-12 21:11:28 · 348 阅读 · 0 评论 -
数据结构之基本概念
数据结构基本概念1、2、算法:对于特定问题求解步骤的一种描述。一个算法具有以下5个重要特性a、有穷性:有穷步骤之后结束,有穷时间内完成。b、确定性:无二义性,同输入只能得出同输出。c、可行性d、输入e、输出3、算法设计要求a、正确性b、可读性c、健壮性d、效率和低存储空间:效率指算法执行的时间;4、算法效率度量通常有两种方法:(1)事后统计的方法:利用计算机内部的计...原创 2019-01-14 20:43:50 · 408 阅读 · 0 评论