数据结构
自己的数据结构学习记录
康娜喵
理论与工程,性能与外表,我全都要!
展开
-
【数据结构学习记录30】——各种内部排序的比较
一.性能分析二.应用应用的考虑因素:元素数目、元素大小、关键字结构及分布、稳定性、存储结构、辅助空间等若n较小时(n≤50),可采用直接插入排序或简单选择排序若n较大时,则采用快排、堆排或归并排序若n很大,记录关键字位数较少且可分解,采用基数排序当文件的n个关键字随机分布是,任何借助于“比较”的排序,至少需要O(nlogzn)的时间若初始基本有序,则采用直接插入或冒泡排序当记录元素比较大,应避免大量移动的排序算法,尽量采用链式存储三.结语现在大概考研部分的数据结构已经完成了,自己原创 2020-12-22 19:54:38 · 188 阅读 · 0 评论 -
【数据结构学习记录29】——基数排序
一.原理所谓的基数排序的基数,就是我们讲进制时候的那个基数。比如十进制的基数就是10,二进制的基数就是2。其中,从右向左开始第n位,实际上表示的是基数的n次方倍。比如1012表示1⋅20+0⋅21+1⋅221\cdot2^0+0\cdot2^1+1\cdot2^21⋅20+0⋅21+1⋅22那么,我们可以通过先比较某一位,进行排序,然后再比较另一位进行排序,直到排完所有的位数。比如我们以LSD低位优先法,从右往左一位一位的比较;或者MSD高位优先法,从左到右一位一位的比较,从左往右一位一位的比较。过程原创 2020-12-22 19:30:29 · 854 阅读 · 0 评论 -
【数据结构学习记录28】——归并排序
一.原理我们常见的归并排序,又叫做2路归并排序,相当于是将两个顺序表或链表合在一起的操作。如果我们通过二分法来实现,将个长的顺序表一直二分法一直分到最小的子序列,然后从最小子序列逐步合并成大的表,那么最后这个大表就是有序的了。所以这是一个递归的过程,时间复杂度为nlog2nnlog_2nnlog2n二.过程因为是个递归的过程,所以一起展示比较方便假设一个有序表的元素是0~n共n+1个元素,其中开始表示l,结束表示h,中间元素表示为m=(l+h)/2递归表达式可以写为:sort(l,h)={原创 2020-12-22 16:46:13 · 249 阅读 · 0 评论 -
【数据结构学习记录27】——选择排序和堆排序
选择排序和堆排序一.选择排序1.原理2.过程3.代码二.堆排序1.堆的概念2.堆与完全二叉树的关系3.堆排序的过程4.构造堆5.调整堆6.代码一.选择排序1.原理选择排序比较简单,就是每一次遍历后,将无序区的一个最大(最小)值与无序区的第一个值或最后一个值交换,这样,无序区渐渐的变为有序,最终完成排序。它的时间复杂度也是O(n2)O(n^2)O(n2)2.过程3.代码int selectsort(int arry[], int len){ int min, i, j, temp;原创 2020-12-22 11:21:26 · 135 阅读 · 0 评论 -
【数据结构学习记录26】——冒泡与快速排序
冒泡与快速排序一.冒泡排序1.原理2.排序过程3.代码二.快速排序1.原理2.排序过程3.性能分析4.代码一.冒泡排序1.原理在快速排序之前,我们得了解一下拥有差不多思想的一个简单版的排序,冒泡排序(或起泡排序)。在冒泡排序中,我们的思路类似于吐泡泡一样或者扔石头一样:从后往前,把最小(最大)的值移动到最前面(或最后面) ,直到所有元素都被排序后,这个序列就变得有序。冒泡排序的时间复杂度为:O(n2)O(n^2)O(n2)2.排序过程3.代码这里举例一个把最大元素“沉”到最后的代码。v原创 2020-12-21 11:20:08 · 218 阅读 · 0 评论 -
【数据结构学习记录25】——排序与插入排序
插入排序零.排序的基本概念1.定义2.稳定性3.内外部排序一.直接插入排序1.算法原理2.实现过程3.代码实现二.折半插入排序1.算法原理零.排序的基本概念1.定义假设含n个记录的序列:{R1,R2,R3,···,Rn}其相应的关键字序列为:{K1,K2,K3,···,Kn}。需确定1,2,3,···,n的一种排列p1,p2,p3,···,pn,使其相应的关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤K p3 ≤ ··· ≤ Kpn即,使最上面的那个序列成为一个按关键字有序的序原创 2020-12-18 11:55:58 · 516 阅读 · 0 评论 -
【数据结构学习记录24】——查找
查找的概念零.前言一.查找的概述二.概念三.性能分析零.前言这一大章(查找系列)都只给出概念,并不以代码实现,更多的地方是数学分析。一.查找的概述查找表是由同一类类型的数据元素构成(或记录)构成的集合。现在查找一般会有四种操作查询某个特定的元素是否在查找表中。检索某个特定的元素的各种属性。在查找表中,插入一个数据元素。在查找表中,删掉某个数据元素。如果我们的查找表只有前两种操作,那么该类表叫静态查找表。如果在查找的过程中,出现了增删,那么这类表叫动态查找表。二.概念关键字(Ke原创 2020-12-15 20:19:13 · 201 阅读 · 0 评论 -
【数据结构学习记录23】——最短路径
最短路径一.概述二.迪杰斯特拉(Dijkstra)算法三.一.概述最短路径是指:如果给定一个有向、无向网,找到一条路径,使得两个顶点间的权和最小。比如:这个图里,V0到V5的最短路径是60。(V0–V4–V3–V5)二.迪杰斯特拉(Dijkstra)算法这个算法和前面最小生成树的算法思想一模一样,代码甚至都基本相同,只是求的对象不同,还是以顶点出发,向周围拓展。只不过标记数组的叠加态为当前顶点到其他顶点的所有顶点的最短路径上权只和。代码这篇就不详写了。三....原创 2020-12-15 11:27:18 · 403 阅读 · 1 评论 -
【数据结构学习记录22】——有向无环图及其应用
有向无环图及其应用一.有向无环图的概念二.拓扑排序(AOV网)1.概念2.偏序与全序a).偏序b).全序c).偏序与全序的区别3.拓扑有序4.拓扑排序的过程三.关键路径(AOE网)1.概念2.实现a).最早发生时间Ve(j)b).最晚发生时间Vl(j)c).e(i)d).l(i)四.代码1.AOV2.AOE一.有向无环图的概念一个无环的有向图称作有向无环图。简称DAG图。DAG图是相较于有向树的更特殊的图。比如:检查一个图是否有环,可以通过遍历+标记的方式进行检查,若某个顶点的弧指向了另一个已经遍历过原创 2020-12-13 14:59:17 · 3423 阅读 · 0 评论 -
【数据结构学习记录21】——两种最小生成树的算法
两种最小生成树的算法一.前言二.普里姆算法1.原理2.流程三.克鲁斯卡尔算法1.原理2.流程3.并查集四.代码一.前言什么是最小生成树?假设我们有一个连通的网(弧或边带权的图),在这个网里,我们需要构建一个(强)连通分量,且该连通分量的权的和最小。举个例子,就像给你一个镇的地图,在已知的所有路上,新修一条造价最小的村村通。二.普里姆算法1.原理普里姆算法的思想就是,有顶点集U,和已确定的顶点集V。然后:从U里任意取一个顶点,然后加入到V中。从(U-V)的集合里取一个元素,找一条弧(边)从该元原创 2020-12-08 16:55:01 · 798 阅读 · 0 评论 -
【数据结构学习记录20】——图的两种遍历
一.两种遍历1.深度优先搜索(DFS)深度优先搜索,顾名思义,就是优先向更深的地方搜索。假设这是一棵树,那么深度优先搜索会优先向深度更高的结点搜索。因为深度优先搜索的概念,要到最深的结点后才返回,所以同层次的结点是先访问,后遍历,符合栈的结构模型,所以我们的深度优先搜索一般都是通过递归实现。对于这个像树的图来讲:假设我们的从1开始遍历,那么他会优先访问深度更高的顶点:最终,它的遍历顺序为:GraphG DFS:1 2 4 8 5 3 6 72.广度优先搜索(BFS)定义与DFS相似,广度原创 2020-12-04 12:20:18 · 507 阅读 · 0 评论 -
【数据结构学习记录19】——图的储存结构
一.邻接矩阵邻接矩阵很简单,假设我们有n个变量,那么我们就创建一个n*n的矩阵G。假设弧是为<i,j>那么我们可以通过矩阵G[i][j]的值来判断这个弧是否存在。比如不存在的弧,我们规定为值为0,存在的弧则为1,若有权,则为它的权。例如下图所示的图,用邻接矩阵表示则为:∣0100101100000000∣\begin{vmatrix}0 & 1 &0 &0 \\1&0 &1 &1 \\0&0 &0 &0原创 2020-12-01 23:42:43 · 172 阅读 · 0 评论 -
【数据结构学习记录18】——图的概念
图的概念零.前言一.术语1.描述2.完全图3.稀疏、稠密图4.子图5.邻接与度6.路径与回环7.连通图与连通分量8.生成树9.有向树和生成森林二.图的储存结构三.图的遍历零.前言在前面,学习了链表和树。在链表里,元素只有线性关系,每个元素一般只有一个前驱和后继。在树中,元素之间有明显的层次关系,并且每一层上的元素可能和下一层的多个元素有关,但是只能和上一层的某一个元素有关。而在图,我们结点间的关系是可以任意的,就好比一棵树,结点只有一个双亲,而图能拥有多个双亲。。。听起来怪怪的。。一.术语1.原创 2020-11-30 21:28:27 · 282 阅读 · 0 评论 -
【数据结构学习记录17】——赫夫曼树与赫夫编码
哈夫曼树一.赫夫曼树1.概念2.实现二.赫夫曼编码1.背景2.原理一.赫夫曼树1.概念首先,我们得了解一下几个概念:路径:一个结点到另一个结点之间的路径。路径长度:路径上的分支数目叫路径长度。带权路径长度:所有叶子结点的带权路径长度之和。如下图,该树的路径长度是:1+2+3+3=9而带权路径则是:1*7+2*5+3+2+3*4=352.实现那么,我们如何构造一棵赫夫曼树呢?不难得出,肯定是权越大的结点,它的路径长度应该最短。按以下步骤:根据权值,将每个结点记作一棵树,记为F1 · ·原创 2020-11-28 10:01:10 · 217 阅读 · 0 评论 -
【数据结构学习记录16】——树与森林
树与森林一.树的储存结构1.双亲表示法2.孩子表示法3.孩子兄弟表示法二.兄弟孩子森林的操作1.森林转换成二叉树2.二叉树转换成森林3.兄弟孩子森林的遍历a.先序遍历(其实是DFS哦)b.后序遍历4.说明一.树的储存结构在大量的应用中,人们用过多种形式的存储结构来表示树。现在会详细的讲述三种储存结构,并详细研究其中最优秀的一种储存结构。1.双亲表示法我们通过一个顺序表来存储这个树,表内的内容有:树本身的内容和它双亲的顺序表下标。它的根结点的双亲下标为-1即可。如果我们要求根结点,那么只需要重复取某原创 2020-11-24 20:55:41 · 266 阅读 · 0 评论 -
【数据结构学习记录15】——线索二叉树
线索二叉树一.概念二.实现三.代码实现一.概念什么是线索二叉树?在我们写二叉树的时候,我们在末端结点的左右儿子用了NULL来表示,以告知结束。如果我们将这个左右儿子指向的地址指向下一个该遍历的结点,那岂不是就能提高结点的利用率?一个结点,在它的之前遍历的那个结点,叫这个结点的前驱,同理,在它之后遍历的第一个结点,叫做后继 。我觉得这幅图画得很好:实质上来说,线索二叉树,能将一个二叉树变成一个双向链表。其中指向前驱和后记的指针,叫做线索, 加上线索的二叉树就叫线索二叉树二.实现为了实现我们的线索原创 2020-11-24 09:11:45 · 171 阅读 · 0 评论 -
【数据结构学习记录14】——树与二叉树
树与二叉树零.前言一.树1.定义2.性质3.表示方式4.基本术语二.二叉树1.小介绍2.性质3.二叉树的储存结构3.1 顺序储存3.2 二叉链表3.3 三叉链表4.二叉树的遍历4.1 定义4.2 先序遍历4.3 中序遍历4.4 后序遍历三.编程原理1.存储结构2.存储(先序遍历)3.遍历输出四.代码实现零.前言本来上一章应该还有稀疏矩阵的十字链表存储和广义表。但是广义表,更多的是偏向于题目,了解下概念,能计算就行了。广义表从某种程度来说,也算是一棵树。一.树1.定义树是一个n(>=0)个结原创 2020-11-20 18:29:57 · 270 阅读 · 0 评论 -
【数据结构学习记录13】——稀疏矩阵的表示与运算
稀疏矩阵的表示与运算一.介绍二.实现稀疏矩阵的原理1.稀疏矩阵的顺序存储2.稀疏矩阵的转置T3.求转置的方法4.快速求转置法5.稀疏矩阵加法(减法同理)6.稀疏矩阵的乘法三.稀疏矩阵的代码定义1.稀疏矩阵的元素2.稀疏矩阵的定义3.稀疏矩阵的快速转置4.稀疏矩阵的加减法5.稀疏矩阵的乘法四.代码实现一.介绍什么是稀疏矩阵,假设我们有一个矩阵(以下部分回去重新编辑)[000000025000]\begin{bmatrix} 0 & 0 &0 &0\\ 0 &am原创 2020-11-13 14:58:26 · 5319 阅读 · 1 评论 -
【数据结构学习记录12】——多维数组的顺序实现
多维数组的顺序实现一.前言二.数组的结构再探1.降维2.下标计算3.名词解释三.实现原理1.数组的结构2.数组的初始化3.数组的取地址4.数组的取值与修改四.代码实现1.stdarg.h1.1 va_list1.2 va_start()1.3 va_arg()1.4 va_end()1.6 样例代码2.主代码一.前言对于数组,我们大家肯定不陌生。单维数组肯定很熟悉,那多维数组呢?实际上就是多个单维数组所构成的特殊的数组的数组。这一内容,在C++的文章里也提到过。那么,我们如何通过用线性结构来模拟一个多维原创 2020-11-10 22:31:34 · 531 阅读 · 0 评论 -
【数据结构学习记录11】——KMP算法,AC自动机青春版
@TOP一.前言上一节中,我们通过一种暴力的串搜索(匹配)方法,学名叫做BF算法。而这种方法的时间复杂度能够达到O(mn)的数量级,而有些程序员就不乐意了,于是乎有三个分别以KMP字母开头的大佬发明出了这种理论上在O(mn),实际上经常在O(m+n)的一种搜索算法,我们称为KMP算法。二.原理介绍1.前后缀我们要先懂得前后缀是啥玩意儿。假设我们有字符串Kanna那么它的前缀有:Kann、Kan、Ka、 K而它的后缀有:anna、nna、na、a很好理解对吧,就不多说了。不过一个字符串的本身是原创 2020-11-09 14:42:18 · 350 阅读 · 1 评论 -
【数据结构学习记录10】——串
串的实现一.简述1.前言2.性质定义二.实现1.简述串2.串的结构3.串的初始化4.串的"加法"5.串的比较6.串的销毁7.返回字串8.查找字串三.代码一.简述1.前言书上说的:“在处理字符串数据时,会比处理整数或浮点数要复杂的多,且在不同类型的应用中,所用的字符串有不同的特点。所以要想有效的实现字符串处理,就必须根据具体的情况使用合适的储存结构。”我想,这因该是这一章存在的意义吧。2.性质定义串是由零个活多个字符组成的有限序列,一般记为:s = a0a1a2···an (n>=0)s是原创 2020-11-06 15:14:53 · 187 阅读 · 0 评论 -
【数据结构学习记录9】——双向队列
循环队列一.概述二.原理实现1.节点2.循环队列结构3.队列的初始化以及空队列判断4.队列队满的判断5.队列的入队6.队列的出队三.代码实现一.概述因为队列的特殊构造,所以我们一般就像上节那样,使用链式列表。但是把,有些时候,顺序结构有顺序结构的好处,所以我们也是可以通过某种方式来用顺序表实现列表。那就是通过循环队列来实现。二.原理实现1.节点因为是顺序结构,所以我们节点不需要其他的东西,只需要储存数据就可以了。2.循环队列结构因为循环队列的特殊机制,我们一般不考虑对队列进行扩容。那么就因该有原创 2020-11-02 23:09:12 · 941 阅读 · 1 评论 -
【数据结构学习记录8】——队列
@队列一.概念二.原理实现1.节点2.队列3.入队4.出队5.销毁三.代码一.概念和栈相反,队列是一种先进先出(first in first out = FIFO)的结构。FIFO是单片机的FIFO吗?它是一种线性表,只允许在表的一端插入元素,另一端删除元素。在队列中,能插入的一端叫队尾,允许删除的一端叫队头。二.原理实现1.节点因为我们队列还是一种线性表,所以我们的队列的节点因该还是由两个部分构成:数据区和指向下一个节点的指针。2.队列如果要实现一个队列,我们只需要两个指针并指向它的队头和原创 2020-11-02 12:28:33 · 409 阅读 · 1 评论 -
【数据结构学习记录7】——栈与递归(其实更多的是解析递归)
@栈与递归(其实更多的是解析递归)一.递归1.概念2.实现3.较难的递归分析——汉诺塔二.栈与递归的关系一.递归1.概念什么是递归,就是高中数学上我们学的那个,递推式。当然,如果把一个递推公式用函数来表示,那么我们可以叫这个函数递归函数。递归函数是一个直接调用自己或通过一系列的语句简介地调用自己的函数,称作递归函数。比如我们的阶乘函数:Fact(n)={1,n=0n⋅Fact(n−1),n>0Fact(n)=\left\{\begin{aligned}1,n=0\\n\cdot Fa原创 2020-11-01 16:01:23 · 254 阅读 · 0 评论 -
【数据结构学习记录6】——栈的应用
一.进制转换1.原理因为我们对N进制转换都是通过除N取余的方法来实现的,然后将余数的结果倒序输出。因为是倒序嘛,所以是后进先出,那就是我们栈的模型。所以我们只需要将每次取余的结果放入栈中,最后再全部输出,就完成了我们的进制转换。那么就举一个10转N进制的程序吧(0<N<=36)。2.代码实现因为这个部分的代码比较简单,所以就直接用数组模拟栈了:#include <stdio.h>int main(){ int number; int stack[32原创 2020-10-30 16:16:59 · 164 阅读 · 0 评论 -
【数据结构学习记录5】——栈(顺序栈)
顺序栈一.概念二.栈的结构定义1.栈定义2.初始化栈3.销毁栈4.栈是否为空5.栈长度6.栈顶元素7.入栈8.出栈三.代码实现一.概念栈是一种仅在表尾进行插入或者删除操作的线性表。且表的首尾两端都有特殊的含义:表头我们一般称为栈底,表尾(最后一个元素的位置)称为栈顶,不含元素或者栈底=栈顶的栈,我们称之为空栈。所以,栈是一种先进后出的表结构。这种情况,和我们的火车调度站非常相似。二.栈的结构定义因为栈的内部储存结构,可以用顺序结构,也可以用链式结构,但在这部分储存方式与前面的线性表、单链表相似,所原创 2020-10-29 19:05:07 · 821 阅读 · 0 评论 -
【数据结构学习记录4】—— 双向链表
双向链表一.简述二.思路图解2.1 节点2.2 链表结构2.3 链表的初始化2.4 链表的遍历2.5 链表的插入2.6 链表的删除2.7 链表的修改/查询一.简述双向链表的含义就是,一个节点除了下一个节点的地址,还要额外储存上一个节点的地址。这样,假设你知道其中一个节点的地址的话,我们可以很方便的“向前”和“向后”遍历,而不是单链表的只能“向后”遍历。所以,双链表比单链表更灵活,遍历的话,会花稍微更少的时间,但是会额外花费的储存空间。有些题可能比较离谱,会“进进退退”,所以单链表也无法完成这些功能。原创 2020-10-28 19:44:52 · 289 阅读 · 0 评论 -
【数据结构学习记录3】—— 单链表
数据结构学习记录3——单链表一.原理1.简述2.分析3.思路图解1.3.1 节点的定义1.3.2 链表的定义1.3.3 链表/节点的初始化1.3.4 表的遍历1.3.5 表的销毁1.3.6 节点插入1.3.7 节点的删除1.3.7 节点的修改1.3.8 节点的查询二.代码一.原理1.简述因为顺序表是一段固定的空间,所以会存在空间的时候率的一些问题。如果能通过某种方式,动态的将一个又一个的节点串接起来,那就可能会好很多,所以,在这种情况下,我们想出了单链表这种数据结构。2.分析对于单链表,我们肯定还原创 2020-10-26 12:58:32 · 196 阅读 · 0 评论 -
【数据结构学习记录2】—— 线性表之顺序储存(顺序表)
顺序表零.前言一.原理1.简述2.分析3.思路图解1.3.0 初始化之前的思考1.3.1 表的创建1.3.2 销毁1.3.3 插入零.前言这内容可能和书上的代码不一样,因为我是加入了我的理解的,所以可能会有不合理的地方,如果出现问题,可以请大家斧正QAQ一.原理1.简述一个数组是最简单的线性顺序储存结构,但是,当我们的数据成员比较多的时候,比如一个学生类型的数据结构,会有他的姓名、学号等信息,所以我们需要对这部分自定义一个结构体。当然,使用结构体数组就可以完成这个目的——把学生类组成一张线性表。原创 2020-10-21 22:52:54 · 1224 阅读 · 0 评论 -
【数据结构学习记录1】—— 导论
绪论零.前言一.基本概念和术语二.如何表示抽象数据类型三.算法和算法分析1.算法2.算法的设计要求3.算法效率的度量4.算法的空间要求零.前言又开了一个坑,记录自己数据结构的学习。本文章基于的书是清华大学版的严蔚敏《数据结构》C语言版。一.基本概念和术语数据: 数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号总称。数据元素:是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时候,一个数据元素可以由若干个数据项组成,比如我们常见的结构体等。原创 2020-10-20 11:26:48 · 766 阅读 · 0 评论