数据结构
文章平均质量分 74
刷LeetCode的基础。
123_YQH
努力不秃头!
展开
-
1. 算法
1.算法算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每一条指令表示一个或多个操作。1.1算法特性算法有5个特性:输入、输出、有穷性、确定性和可行性。输入输出:算法具有0个或多个输入,但至少有一个或多个输出。有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每个步骤在可接受时间内完成。确定性:算法的每一个步骤都具有确定的含义,不会出现二义性。可行性:算法的每一步都能通过执行有限次数完成。1.2算法设计的要求算法不是唯一的,但是相对好的算法是存在原创 2021-08-17 20:58:18 · 475 阅读 · 0 评论 -
2.1顺序表
线性表线性表:零个或多个数据元素的有限序列。分为线性存储结构和链式存储结构。1.线性表的定义线性表(List)的定义:零个或多个数据元素的有限序列。有两个值得注意的地方:首先它是一个序列。第一个元素无前驱,最后一个元素无后继,中间元素只能出现存在一个前驱和一个后继的情况,不能出现一对多或多对一的情况。线性表是有限的序列。例1:12星座都是白羊座拍第一,双鱼座排第二,每个星座都有前驱和后继属于线性表。例2:公司组织架构,一个总监理管理多个总监,每个总监管理几个经理,每个经理又有自己的下属员原创 2021-08-18 20:39:03 · 204 阅读 · 0 评论 -
2.2单链表
线性表的链式存储结构链式存储结构主要分为单链表、静态链表、循环链表和双向链表四种结构。在C++标准库中,list是双向链表,forward_list是单向链表,标准库里的容器支持很多的操作,但是这里我自己写的链表只包括链表最基本的操作:获取第i个结点的数值、在第i个结点前插入一个结点、删除第i个结点。1.线性表链式存储结构定义链式存储结构的内存空间是未被占用的任意位置,存储数据的元素信息和它的后继元素的存储地址。存储直接后继位置的域称为指针域**,存储数据元素信息的域称为**数据域,这两部分信息组原创 2021-08-23 09:33:41 · 235 阅读 · 0 评论 -
2.3静态链表、循环链表和双向链表
静态链表、循环链表和双向链表1.静态链表早期语言如Basic,由于没有指针,链表结构无法实现,就有人想出来用数组代替指针描述单链表。数组的元素都是两个数据域组成,data和cur,即数组的每个下表都对应一个data和一个cur。数据域data,用来存放数据元素;cur相当于单链表中的next指针,用来存放该元素的后继在数组中的下标,cur又叫游标。我们把这种用数组来描述的链表称为静态链表。1.1静态链表的实现静态链表的实现方法:未被使用的数组元素称为备用链表数组的第一个元素不存储数据,cu原创 2021-08-23 20:12:41 · 268 阅读 · 0 评论 -
3.1 栈(顺序栈和链栈)
111原创 2021-08-24 16:52:18 · 2169 阅读 · 0 评论 -
3.2队列
111原创 2021-08-27 16:57:00 · 150 阅读 · 0 评论 -
4.1 串
111原创 2021-08-30 17:12:47 · 78 阅读 · 0 评论 -
5.1树的定义
树的定义现实中有很多一对多的线性结构,我们需要研究这种一对多的数据结构——“树”。树的定义:树是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:① 有且只有一个特定的称为根(root)的结点;②当n>1时,其余节点(非根结点)可分为m个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根的子树,如下图所示:对于上图的树来说,结点b、d、e组成了根结点的子树T1;c、f组成了根节点的子树T2。而子树T1和T2本身也是一颗树,对于树T1来说,b结点是其根节点。原创 2021-11-11 17:15:39 · 589 阅读 · 0 评论 -
5.2树的存储结构
树的存储结构树的某个结点的孩子可以有多个,如果按顺序存储结构存储,数据元素挨个存储,我们就看不出谁是谁的双亲,谁是谁的孩子,简单的顺序存储结构不能满足树的实现要求。但是可以充分利用顺序和链式存储结构特点实现对树的存储结构的表示。下面主要介绍三种表示法:双亲表示法、孩子表示法、孩子兄弟表示法。1.双亲表示法对于一个结点(根节点除外)可能没有孩子结点,但肯定有双亲。假设以一组连续空间存储树的结点,每个节点中除了包含自己的数据之外,还包含双亲结点在数组中的位置。结构如下所示:Data表示数据域,存储原创 2021-11-11 22:06:32 · 956 阅读 · 0 评论 -
5.3二叉树的定义
二叉树的定义对于在某种阶段都是两种结果的情形,比如开和管、0和1、真和假等,都适合用二叉树结构来建模。例如,查找16内的某个数,可以用二分查找法,一定能在4次查找内查出结果。二叉树是n个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的、分别成为根节点的左子树和右子树的二叉树组成。如:下左图就是一个二叉树,下右图由于结点b有三个子树,所以它不是二叉树。1.二叉树的特点二叉树的特点有:每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。左子树和右子树是有原创 2021-11-12 14:02:52 · 816 阅读 · 0 评论 -
5.4二叉树的性质
二叉树的性质1.二叉树的性质1性质1:在二叉树的第i层至多有2i−1个结点性质1:在二叉树的第i层至多有2^{i-1}个结点性质1:在二叉树的第i层至多有2i−1个结点这个很好理解,观察一下满二叉树,第一层最多有1个结点,第二层最多有2个结点,第三层最多有4个结点…以此类推,可以得出上述结论。2.二叉树的性质2性质2:深度为k的二叉树至多有2k−1个结点(k≥1)性质2:深度为k的二叉树至多有2^k-1个结点(k≥1)性质2:深度为k的二叉树至多有2k−1个结点(k≥1)这个性质也可以原创 2021-11-12 20:16:11 · 1083 阅读 · 1 评论 -
5.5二叉树的存储结构
二叉树的存储结构1.二叉树的顺序存储结构顺序存储结构对存储树这种一对多的关系结构实现起来是比较困难的。但是二叉树由于其特殊性,可以用顺序结构来实现。①完全二叉树的顺序存储例如:用数组对如下二叉树进行存储由于完全二叉树定义严格,可以直接将完全二叉树的结点存放进数组里,这里就体现了完全二叉树的优越性。②一般二叉树的顺序存储对于一般的二叉树,可以将其按完全二叉树编号,但是要把不存在的结点设置为“^”。例如:用数组对如下二叉树进行存储③右斜树的顺序存储例如:用数组对如下右斜树进行存储很显原创 2021-11-12 21:26:15 · 1146 阅读 · 1 评论 -
5.6遍历二叉树
遍历二叉树相同数量的100元和20元钞票落在地上,要想一定时间内捡的钱最多,大家肯定是先捡100元的,因为捡1张100元的等于捡了5张20元的,效率高了很多。捡钱顺序非常重要!对于二叉树来说,次序同样很重要。 例如,人生会有很多十字路口,就像一个二叉树,初中升高中还是职业学校,高中升大学还是大专,专业选热门还是喜欢的……你选择的次序会直接影响你的人生。其实上面的人生,大多数人都不需要选择,因为心里都直到哪条路更好。二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树中的结点,使得每个结点被访问一原创 2021-11-15 17:06:56 · 797 阅读 · 1 评论 -
5.7树、森林与二叉树的转换
树、森林与二叉树的转换1.树转换成二叉树树转换成二叉树的步骤如下:加线。所有兄弟之间加一条连线。去线。对树的每个结点,只保留它与第一个孩子的连线,删除它与其他孩子的连线层次调整。以树的根节点为轴心,将整棵树顺时针旋转一定的角度,结点的左孩子是原来结点的第一个孩子,右孩子是结点原来的兄弟。例:把下面的树转换成二叉树2.森林转换为二叉树森林是由若干棵树组成,可以理解为,森林中的每一棵树都是兄弟,可以按照兄弟的处理方法来操作。将森林转换成二叉树的步骤如下:把每棵树转换成二叉树。第一棵原创 2021-11-15 21:08:17 · 3835 阅读 · 1 评论 -
6.1图的定义
图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为 G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。定义中值得注意的几个点有:图中数据元素我们称之为顶点(vertex),而再线性表中我们称之为元素,树中我们称之为结点。图中不允许顶点集为空,但允许边集为空。线性表中,相邻元素具有线性关系;树结构中,相邻两层的结点具有层次关系;图中,任意两个顶点之间可能都有关系,顶点之间的逻辑关系用边来表示。本章介绍的图都是简单图,所谓简单图就是:不存在顶点到原创 2021-11-18 16:40:32 · 1828 阅读 · 1 评论 -
6.2.1图的存储结构——邻接矩阵法
图是由顶点和边组成,直接存储比较困难,但是可以对顶点和边分别存储。顶点可以用一个一维数组存储顶点信息。边或弧是顶点之间的关系,可以用一个二维数组来存储。邻接矩阵法就是用这种方法来存储图的。图的邻接矩阵存储方式是用两个数组来表示图。一个一维数组来存储图中顶点的信息,一个二维数组(称为邻接矩阵)用来存储图中的边或弧的信息。我们先来看无向图的邻接矩阵存储方式。①无向图的邻接矩阵存储方式设图有n个顶点,则邻接矩阵就是一个n×n的矩阵。例:矩阵主对角线全为0是因为顶点不存在到自身的边;arc[0] [2原创 2021-11-18 21:24:23 · 2937 阅读 · 1 评论 -
6.2.2图的存储结构——邻接表法
图的存储结构——邻接表法对于边数相对顶点较少的图,用邻接矩阵法会对存储空间造成极大的浪费。如下图:邻接矩阵除了arc[1] [0]有权值外,没有其他弧,其实这些存储空间都浪费掉了。对于这种结构,我们可以使用数组与链表相结合的存储方法,称为邻接表。邻接表的处理方法如下:图中顶点用一个一维数组存储。对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点边的信息。图中每个顶点vi的所有邻接点构成表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有原创 2021-11-23 15:55:59 · 2576 阅读 · 1 评论 -
6.3深度优先遍历和广度优先遍历
图的遍历图的遍历与树的遍历类似,希望从图中某一顶点出发访问图中其余顶点,且每个顶点只访问一次,这一过程就叫做图的遍历。1.深度优先遍历深度优先遍历,也称为深度有限搜索,简称DFS。从图中某个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历图直至所有和v有路径相通的顶点都被访问到。类似于树的前序遍历。例如:对如下的图进行深度优先遍历,假设在没碰到重复顶点的情况下始终访问最右手的顶点,访问过的顶点会被标记。遍历过程为:从a开始,标记a。此时有3个分支b、c、e,b为最右手顶点,原创 2021-11-19 14:43:50 · 1072 阅读 · 1 评论 -
6.4最小生成树
假设你是电信实施工程师,需要为5个村庄架设通信网络做设计,即把这5个村庄都用电缆连接起来,要求用最小的成本来完成这项任务。村庄位置如下,连线之间数字表示村与村间可通达的直线距离,结点之间没有连线表示有高山或湖泊不予考虑。这个网用邻接矩阵法表示为:连接起这5个村庄至少要4条路径。显然,连通网(网的任意两个节点之间都有路径连接)的生成树(包含图中全部顶点,但只有足以构成树的n-1条边)满足要求,比生成树路径还多显然浪费了资源,那么这个问题就转换成如何求连通网的最小生成树。主要有两种方法可以找到连通网的原创 2021-11-19 21:52:31 · 725 阅读 · 1 评论 -
6.5最短路径
最短路径对于网图来说,最短路径是指两顶点之间经过的边上的权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。下面主要介绍两种解决最短路径的算法:迪杰斯特拉(Dijkstra)算法:主要从某个源点到其余各顶点的最短路径问题。时间复杂度为O(n^2)弗洛伊德(Floyd)算法:主要用来解决从所有顶点到所有顶点间的最短路径问题。时间复杂度为O(n^3)。1.迪杰斯特拉(Dijkstra)算法下面从一个例子开始:例:用迪杰斯特拉算法对下列网图求顶点1到各顶点的最短路径。原创 2021-11-22 20:39:21 · 1011 阅读 · 1 评论 -
6.6拓扑排序
拓扑排序在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示网的图,我们称为AOV网。例如,我们的升学,只有上完小学才上中学,上了中学才能上大学,上了大学才能上研究生等。1.拓扑排序介绍设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1,v2,….vn,若满足从顶点vi到vj之间有一条路径,则在顶点的序列中顶带你vi必须在顶点vj之前。我们称这样的序列为一个拓扑序列。所谓拓扑排序就是对一个有向图构造拓扑序列的过程。如:两个拓扑序列为:c1,原创 2021-11-23 14:36:35 · 1212 阅读 · 1 评论 -
7.1查找概论
7.1查找概论如今我们在计算机上进行的所有操作几乎都会涉及查找操作,例如,百度搜索今日天气;打开b站搜索喜欢的up主的视频等都要涉及到查找操作。所有这些需要被查的数据所在的集合,我们给它一个统称叫查找表。①基本概念查找表:是由同一类型的数据元素(记录)构成的集合。关键字(key):数据元素(记录)中某个数据项的值,由称为键值。用它可以标志一个数据元素(记录);也可以标志一个数据元素(记录)的某个数据项(字段),我们称为关键码。主关键字:如果关键字可以唯一地标志一个记录,则称此关键字为主关键字。 这原创 2021-11-24 10:35:51 · 524 阅读 · 1 评论 -
7.2顺序表查找
顺序查找一堆未排序的书放置在书架上,它们构成了一个线性表。我们要针对这一线性表进行查找操作,于是这个线性表就构成了静态查找表。顺序查找:又叫线性查找,是最基本的查找技术,它的查找过程是:从表中第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。1.顺序查找算法顺序查找的算法实现如下://顺序查找,a为数组,n为要查找的数组个数,k原创 2021-11-24 11:16:05 · 772 阅读 · 1 评论 -
7.3二分查找法和插值查找法
有序表查找对一个无序的线性表进行查找一个元素时是比较困难的,然而对线性表排序后在进行查找那么查找效率就会高很多。接下来介绍3种对有序表的查找方法。1.二分查找法二分查找法(折半查找法):前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。基本思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找原创 2021-11-24 16:55:16 · 799 阅读 · 0 评论 -
7.5二叉搜索(排序)树
二叉排序树(二叉搜索树)顺序查找表插入、删除操作效率不错,但是由于是无序的,所以查找效率很低。而有序查找表查找效率还行,但由于有序,因此在插入和删除操作后为了保持有序需要花费很大的时间。如果我们想找一种插入、删除和删除效率都不错的数据结构来存放动态查找表,可以使用二叉搜索(排序)树。1.二叉搜索(排序)树定义二叉排序树(Binary Sort Tree),又称为二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树的所有结点的值均小于它的根的值。若它的右子树不空,则原创 2021-11-25 16:49:39 · 485 阅读 · 1 评论 -
7.6平衡二叉树(AVL树)
平衡二叉树(AVL树)平衡二叉树是一种二叉排序树,平衡二叉树的出现是为了解决二叉搜索树因为高度太高而查找效率下降的问题。如:对于数组a[10]={3,2,1,4,5,6,7,10,9,8}.分别构建二叉搜索树和平衡二叉树。如果要查找结点8,左边二叉搜索树搜索过程为:3->4->5->6->7->10->9->8,要查找8次。而平衡二叉树搜索过程为:4->7->9->8,只要搜索8次,可以看出当二叉搜索树高度变得很高之后搜索效率会下降很多。原创 2021-11-26 11:47:00 · 617 阅读 · 0 评论 -
7.7 B树和B+树
2-3树和2-3-4树内存是由硅制的存储芯片组成,这种技术存储成本比磁盘存储贵很多,因此,目前,磁盘容量很大基本都在1T以上,而内存一般还是8g、16g的水平。内存上处理数据的速度比磁盘处理数据的速度快很多。大多数数据结构处理数据都在内存中,但是如果我们操作的 数据特别大,内存已经没法处理了,这种情况下对 数据的处理就需要不断从硬盘或u盘这些存储设备中调入或调出内存页面。一旦涉及这样的操作,就 必须考虑对硬盘等外部存储设备的访问时间和访问次数。访问的 次数越多,显然 花费的时间越多,时间复杂度越高,我们原创 2021-11-27 17:10:10 · 543 阅读 · 0 评论 -
7.8红黑树
红黑树红黑树的本质是对2-3-4树的概念模型,是与2-3-4树等价的二叉树。在红黑树中插入元素类似2-4树,但是红黑树是二叉树,维护起来更容易。1.2-3-4树与红黑树的转换2-3-4树是一棵阶为4的B树,存在2结点,3结点和4结点。每当一个3结点或4结点转换成2结点时,都会增加树的高度。2-3-4树中2结点都是黑色结点,3结点和4结点都是红结点+黑结点表示。红色结点用来表示与黑色父结点的结合,即红结点不能单独看,红节点和他连接的黑色父结点构成一个整体。①2、3、4结点用红黑树表示方式如下:2结原创 2021-11-29 22:40:35 · 438 阅读 · 0 评论 -
7.9哈希表(散列表)
哈希表(散列表)我们先来看看之前所学的各种查找结构的优缺点:顺序查找表:查找需要从表头开始挨个元素进行比较,速度很慢,时间复杂度为O(n)。插入删除速度很快直接插入就行了,时间复杂度为O(1)。有序查找表:由于是有序的,所以查找速度就快了很多,为O(logn)。插入删除由于需要移动记录,速度比较慢,时间复杂度为O(logn)。二叉排序树、平衡二叉树、红黑树:查找和插入删除效率都不错,为O(logn)。我们发现,上述查找结构都不可避免要比较各个元素,有没有一种方法不需要比较,而直接通原创 2021-12-01 14:53:41 · 892 阅读 · 0 评论 -
8.七大排序算法
七大排序1.排序的基本概念与分类①排序的基本概念假设有n个记录的序列为{r1, r2, …, rn},其对应的关键字分别为{k1, k2, k3, …, kn},需要确定1, 2, …, n的一种排列p1, p2, …, pn,使得其对应的关键字满足,kp1 ≤ kp2 ≤ … ≤ kpn,即使得序列称为一个按关键字有序的序列{rp1, rp2, … rpn},这样的操作就叫做排序。如:序列关键字为{2, 3, 5, 1},对其进行升序排列后,得到的结果为{1, 2, 3, 5}。②排序的稳定性原创 2021-12-06 22:40:50 · 3778 阅读 · 14 评论