![](https://img-blog.csdnimg.cn/20190927151043371.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构基础
文章平均质量分 84
就课内简单的数据结构吧
酉鬼2333
废物本废
展开
-
第九章——哈希表
哈希表在了解哈希技术及哈希表之前,首先希望大家对计数排序有一个比较基本的了解(很多人更习惯称计数排序为桶排序,真正意义上的桶排序即是计数排序和哈希技术的结合)。计数排序中有一个桶的概念,就是将数据n放在编号为n的桶中,用数组元素c[i]来表示编号为i的桶。这样可以用c[i]来查询编号为i的数字在序列中出现的次数,最简单的我们可以通过c[i]的下标i知道查询的编号为i。对于数据表中若干的数据,我们也希望用计数排序中同样的方法将出现的数据存储在数组中。但问题就在于出现的数据往往过于分散,导致数组空间的利用原创 2021-12-31 11:16:18 · 601 阅读 · 0 评论 -
第九章——AVL树
树表的查找上一个章节介绍了顺序表中的查找,其中以折半查找,也就是二分查找的效率最高。但是二分查找需要顺序表中的元素有序排列,如果顺序表是动态的,随时需要添加和删除元素,为了维护表的有序性,需要前移和后移表中的很多元素,时间复杂度比较高。所以需要用一些特殊的二叉树/树作为表的存储结构,这里统称为数表。二叉排序树有关二叉排序(搜索)树的介绍和知识点看这篇文章,这里只作代码和例题的解释。二叉排序树的存储结构二叉排序树的存储结构和普通二叉树是一致的。//key为关键字,data为其他数据项,lchi原创 2021-12-31 03:41:00 · 503 阅读 · 0 评论 -
第九章——线性表查找
查找查找的定义就是在存储着若干个元素的数据结构中找出关键字为k的元素的过程。如果在查找的过程中同时对表进行修改,那么称这个表为动态查找表,否则为静态查找表。pi为查找表中第i个元素的概率,ci查找到表中第i个元素需要进行的关键字比较的次数,定义ASL=Σ(pi*ci)为查找成功的平均查找长度,同样地自然有查找失败的平均查找长度。查找算法的ASL值越大,时间性能越差,反之,时间性能越好。线性表查找顾名思义就是在线性表中进行查找。顺序查找这个代码就不演示了,顺序查找就是将所有的元素全部遍历一遍原创 2021-12-30 02:28:49 · 785 阅读 · 0 评论 -
第八章——拓扑排序
拓扑排序首先看这样一个问题:给定n个变量(1-n),和m个二元组(u,v),表示变量u<v。输出所有变量从小到大排列出来的结果。关于这个问题的解答,详见这篇文章这里只提供代码。int g[maxn][maxn];//表示有向边的集合 int flag[maxn],ans[maxn],n,m,t;//flag表示是否被访问过(0表示没有,-1表示正在访问,1表示已经访问过了) bool dfs(int u){ flag[u]=-1;//表示正在访问中 //开始进行访问原创 2021-12-30 00:26:34 · 374 阅读 · 0 评论 -
第八章——最短路径
最短路径问题相关概念的算法操作详见这篇文章。这里只对Dijkstra算法和Floyd算法的代码进行介绍。Dijkstra算法BFS可以求某点到另一点的最短路径长度,Dijkstra算法主要是求某点到其余所有点的最短路径长度(你用BFS慢慢搞也行,时间复杂度会很大)。关于Dijkstra算法会不会出现已经出队的某个确定路径的点不是最短路径的情况呢?其实大家用反证法想一下,如果出现这样的情况,这个点又怎么会率先出队呢?这样就能够明白了。至于很多博客,书上面说的关于路径中出现环的问题,在边权为非负值原创 2021-12-29 21:00:37 · 421 阅读 · 0 评论 -
第八章——生成树和最小生成树
生成树和最小生成树相关概念和算法思路详见这篇文章。这里只对Prim算法和Kruskal算法的代码进行介绍。Prim算法U为当前的连通子图所包含的顶点集合,Prim算法的本质就是每次在V-U的顶点与U的顶点的连边中选出一条加入连通子图,U同时相应地改变,直到U使得图中的所有点连通。//v为最小生成树的起始点,closest[i]为将编号为i的结点加入到集合U中,加入到连通子图的边的另一个端点//lowcost[i]为当前U中的顶点能够与编号为i的结点相连的边的最小花费,如果无法加入或者已经加入花原创 2021-12-29 16:24:04 · 189 阅读 · 0 评论 -
第八章——图
图的基本概念从离散数学的角度来看,图由两个集合V和E组成,其中V是图中顶点的有限集合,记作V(G),E是图中两个顶点(注意这两个顶点不一定是完全不同的)连接成的边的有限集合,记作E(G)。如果G中存在两个顶点连接成的边是笛卡尔积,即存在某一个点到另一个点的方向,那么称G为有向图,否则为无向图。在有向图中,<i,j>和<j,i>是两条不同的边。图的基本术语这里主要从数据结构来看,就不从离散的角度来那么详细地解释这些术语了。端点和邻接点对于无向图中的某条边<i,j&g原创 2021-12-29 01:29:32 · 1514 阅读 · 0 评论 -
第七章——简单特殊二叉树
线索二叉树的概念原创 2021-12-28 00:14:26 · 677 阅读 · 0 评论 -
第七章——二叉树
二叉树的基本概念二叉树类似于2次树,但和2次树有一些不同:1.度为2的树至少有一个结点的度为2,而二叉树没有这种要求。简而言之二叉树可以退化成一条链。2.度为2的树可以不区分左右子树,二叉树中左右子树(结点)的次序严格区分排列。有关满二叉树等基本术语和树那里一样,逻辑表达法和树那里也是一样的。除此之外的有:若二叉树中最多只有最下面两层的结点的度数可以小于2,并且最下面一层的叶子的结点都依次排列在该层最左边的位置上,则这样的二叉树称为完全二叉树。完全二叉树还可以定义为:一棵深度为k,n个结点的二叉原创 2021-12-25 01:44:36 · 2981 阅读 · 0 评论 -
第七章——树
树的基本概念原创 2021-12-15 17:28:50 · 2795 阅读 · 0 评论 -
第六章——广义表
广义表的基本概念广义表是线性表的推广,和线性表一样按照线性结构存储n个元素。和线性表的区别就在于,广义表中的元素可以是一个原子类型(就是不能往下进行分解的,例如整型类,字符类),也可以是一个广义表,这个表示广义表的元素就成为广义表的子表,这些元素之间是满足相对次序的。广义表的长度定义为最外层包含元素的个数,即子表相对于父表(我这里就成为父表了)的长度为1。广义表的深度定义为所含括号的重数,其中原子的深度为0,空表的深度为1。例如对于下面则会个广义表:GL=((),(e),(a,(b,c,d))),G原创 2021-12-10 15:16:45 · 1948 阅读 · 0 评论 -
第六章——稀疏矩阵
稀疏矩阵的基本概念稀疏矩阵也是一种比较特殊的矩阵类型,但比起上一节提到的特殊矩阵类型,它特殊的地方不在于元素的分布而是在于稀疏矩阵中非0元素的个数s相对于矩阵元素的总个数t非常小。例如一个100*100的矩阵,若其中只有100个非0元素,就可称其为稀疏矩阵。稀疏矩阵中元素的位置分布一般是随机的。稀疏矩阵的三元组表示三元组就是指用三种属性来表示某个节点。由于稀疏矩阵的元素分布一般没有规律,就是说不能用数学公式来减少属性的个数,所以在存储非0元素时必须同时存储该非0元素对应的行下标,列下标和元素值。原创 2021-12-10 00:30:55 · 6587 阅读 · 4 评论 -
第六章——数组
数组的基本概念一维数组就是n个相同类型数据元素构成的有限序列。二维数组很多人都比做矩阵,我个人理解上可以看作是以一维数组作为元素的一维数组。推广到d(d>=3)维数组,就是说d维数组是以d-1维数组作为元素的一维数组。d维数组的抽象数据描述基本运算:initarray(&A):初始化数组,为数组A分配空间Destroyarray(&A):销毁数组,释放数组A的存储空间Value(A,index1,index2···,indexd):A是已存在的d维数组,index1,原创 2021-12-08 17:01:57 · 550 阅读 · 0 评论 -
第五章——递归
递归的定义当定义一个过程(往往是函数)时出现调用本过程(函数)的成分称为递归。拿紫书的一个例子来说:递归:参见“递归”。递归:如果还是没有理解,参加“递归”。当然这两个递归都是一个死循环,实际使用时需要避免这样的递归。这种直接调用自身的递归,称为直接递归。如果过程或函数p调用过程或函数q,而q又调用p的递归称为间接递归。任何间接递归算法都可以转换为直接递归。如果一个递归过程或递归函数中的递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。直接看下面这个比较简单的例子。例 5.1设计一个原创 2021-10-20 11:32:25 · 467 阅读 · 0 评论 -
第四章——串的模式匹配
串的模式匹配首先什么叫串的模式匹配?设有两个串s和t,要在串s中找到与t相等的子串。通常将s称为目标串,t称为模式串,这种串的定位查找也称为模式匹配。对于这个问题,常见的两种算法是BF算法和KMP算法。Brute-Force 算法Brute-Force(暴力)算法简称BF算法,也称简单匹配算法。基本思路是采用穷举的方法,一个一个字符进行匹配,如果以第i个字符开头的子串与t不相等,那么枚举第i+1字符开头的子串。BF算法过程模拟:i和j分别从第一位开始匹配:直到匹配某一位失败(如果没有匹配原创 2021-10-16 15:12:19 · 2376 阅读 · 0 评论 -
第四章——串
串的定义字符串简称为串,是由零个或多个字符组成的有限序列。一个串中任意连续字符组成的序列称为该串的子串。串的抽象数据类型描述串的基本操作比较多。StrAssign(&s,cstr):将字符串常量cstr赋给串s,即生成其值等于cstr的串sDestroyStr(&s):销毁串,释放串s分配的存储空间StrCopy(&s,t):串复制,将串t赋给串sStrLength(s):求串长,返回串s中字符的个数Concat(s,t):串连接,返回由两个串s和t连接在一起形成的原创 2021-10-15 13:44:25 · 704 阅读 · 0 评论 -
第三章——队列
队列的定义队列简称队,也是一种操作受限的线性表,其限制为仅允许在表的一端进行插入,在表的另一端进行删除操作,把进行插入的一端称为队尾(rear),向队列插入新元素称为进队或入队(enqueue),新元素进队之后成为新的队尾元素;从队列删除元素称为出队或离队(dequeue),元素出队后,其直接后继元素就成为新的队首元素。由于队列元素进出的规则,队列又称为先进先出(FIFO)表。需要注意的是,以上的规则仅对普通队列成立,双端队列两端都可以进行插入和删除。队列的抽象数据类型描述了解基本运算:Ini原创 2021-10-11 20:39:09 · 901 阅读 · 0 评论 -
第三章——栈
栈的定义事实上关于栈,我在紫书学习那里已经简单地介绍过有关应用的一部分了,但是为了更深入地学习(为了过数据结构这门课),我们还是对书上的知识进行更深入地学习。栈是一种只能在一端进行插入和删除操作的线性表。表中进行操作地一端称为栈顶,表的另一端称为栈底。当栈中没有数据元素时称为空栈,栈的插入操作通常称为进栈或入栈,删除操作通常称为出栈或退栈。栈得主要特点是“后进先出”(LIFO),即后进栈的元素先出栈,每次进栈的数据元素都放在原来栈顶元素之前成为新的栈顶元素,每次出栈的数据元素都是当前栈顶元素。栈原创 2021-10-07 09:10:17 · 540 阅读 · 0 评论 -
第二章——有序表
有序表有序表,其实就是指所有元素以某种顺序排列的一个线性表。为了简单叙述,我们这里假设有序表中的元素递增排序。(循环表就不单独拿出来说了,之前ji)原创 2021-09-26 11:33:56 · 779 阅读 · 0 评论 -
第二章——双链表和循环双链表
线性表——双链表和循环双链表双链表的定义在链表那里就介绍过了,这里就不重复介绍了。双链表和循环双链表同样地,我们用结构体来声明链表中的一个结点:struct DLinkNode{ElemType data; DLinkNode *prior; DLinkNode *next;};//定义双链表结点类型,prior指向前一个结点,next指向后一个结点 和单链表基本是一样的。双链表和循环双链表基本运算的实现这里会提供双链表和循环双链表基本运算的实现及代码。建立双链表——头插法和单链表原创 2021-09-22 11:26:31 · 497 阅读 · 0 评论 -
第二章——单链表和循环单链表
线性表——链表顺序表需要事先占用一整块实现分配大小的存储空间,但是对于某些问题:很多空间只使用一次(甚至根本用不到),使用顺序表存储空间的利用率往往很低。于是需要一种能够动态管理存储空间的存储结构——链表。线性表的链式存储结构——链表线性表的链式存储结构我们简称为链表。其中每个存储结点不仅包含元素本身的信息(称为数据域),而且包含表示元素之间逻辑关系的信息,在C和C++中用指针实现,称为指针域。一种最常见,最基本的方法是在每个结点除包有数据域以外只设置一个指针域,用于指向其后继结点,这样构成的链表原创 2021-09-17 01:25:51 · 2757 阅读 · 0 评论 -
第二章——顺序表
线性表——顺序表绪论什么的就直接过吧。线性表的定义线性表是具有相同特性的数据元素的一个有限序列(官方定义),事实上就是讲一堆具有相同特性可以称之为一类的数据元素排列在一个单一的线性的结构中。该序列中所含元素的个数叫线性表的长度(有人可能会觉得这是废话,然而大家如果学过图和树就知道为什么要在定义这里着重的提一下这个概念)。线性表的抽象数据类型描述主要是需要大家了解一下,线性表中的一些基本运算:InitList(&L):初始化线性表,构造一个空的线性表LDestroyList(&am原创 2021-09-12 00:46:26 · 325 阅读 · 0 评论