数据结构学习笔记
数据是描述客观事物的符号, 是能够被计算机输入, 识别, 处理的各种符号, 是计算机化的信息
数据不可分割的最小单位, 一个元素由若干个数据项构成
它是组成数据的基本单位, 是数据集合中的个体, 在计算机程序中, 通常作为一个整体进行考虑和处理
是性质相同的数据元素的集合, 是数据的一个子集
是指对数据进行查找, 插入, 删除, 合并, 排序, 统计以及简单计算等的操作过程
是研究数据元素之间抽象化的相互关系和这种关系在计算机中的存储表示(即数据的逻辑结构和物理结构), 并对这种结构定义相适应的运算, 设计出相应的算法, 且确保经过这些运算后所得到的新结构仍然是原来的结构类型
数据类型是一个值的集合和定义在这个值集上的一组操作的总称
是指一个数学模型以及定义在该模型上的一组操作抽象数据类型的定义取决于它的一组逻辑特性, 而与其在计算机内部如何表示和实现无关
解决一个问题的方法和步骤
T(N)=O(F(N)), 它表示随问题规模N增大, 算法执行时间增长率与F(N)的增长率相同, F(N)算法的时间复杂性
算法执行时, 若额外空间相对于输入数据量来说是常数, 则称此算法为原地工作
一种数据结构, 是N(N>=# )个同质元素的有限序列, 除首尾元素外, 每个元素有唯一的前驱和唯一的后继
是一种受限线性表, 是先进先出的线性表
在队列的顺序存储结构中, 把存储空间的首尾逻辑上相连, 构成一个环, 使得存储空间上只要有空余的地址, 就可以继续进行入队列操作, 极大利用了物理空间用头部和尾部两个指示器表示队列头和队列尾, 插入在尾部进行, 删除在头部进行
每一个数据元素, 都需用两部分来存储:一部分用于存放数据元素值, 称为数据域;另一部分用于存放直接后继结点的地址(指针), 称为指针域, 元素的存储空间可以连续, 也可以是不连续的而数据元素之间的逻辑关系由指针域来确定
线性表采用链式存储时, 每个结点除一个数据域外, 包含两个指针域, 一个指向该结点的直接后继, 一个指向该结点的直接前驱, 这种方式构成的链表, 即为双向链表
是插入排序的一种, 又叫缩小增量排序, 先按增量进行分组, 组内插入排序, 然后每次缩短增量, 再进行分组和组内插入排序, 直到增量为1时, 进行最后一次排序止
任何一个有N个结点的无向图, 若其边数为N(N-# )/# , 则这个无向图就是完全图
任何一个有N个结点的有向图, 若其弧个数为N(N-# )个, 则这个有向图就是有向完全图
按层次编历方式, 从某一点V0开始遍历它的所有邻接点V1, V2……, 再依次访问V1, V2的所有未被访问过的邻接点, 直到所有的点均遍历完成
数据元素的某个数据项的值, 用它可以标识列表的一个或一组元素
串是字符线性的有限集合
串中任意个连续的字符组成的子序列称作该串的子串
是一种受限线性表, 是插入和删除操作在同一端进行的, 是后进先出的线性表
树是n(n>=# )个结点的有限集在任意一棵非空树中:
(# )有且仅有一个特殊的称为根的结点;
(# )当n>1时, 其余结点可分成m(m># )个互不相交的有限集T1, T2, , Tm, 其中每一个集合本身又是一棵树, 并且称为根的子树
二叉树是每个结点至多有两个孩子结点的一种树其中两个孩子结点分别被称为左孩子结点和右孩子结点
子孙结点以某结点为根的子树中的任一结点都称为该结点的子孙
树中某个结点的子树的根结点称为该结点的孩子结点相反, 称该结点为孩子结点的双亲结点
树的某个结点的分支(子树)个数叫做该结点的度
树的度是树中所有结点的最大度数
结点的左子树深度与右子树深度之差
一个连通图的生成树是指一个极小连通子图, 它含有图中的全部顶点, N-1条边
深度为K, 且有2K -1个结点的二叉树
物理结构又称为数据的存储结构, 是指数据的逻辑结构在计算机中的映像(表示), 即数据结构在计算机中的存储方法
在二叉树中, 利用空余的指针指向二叉树某种遍历方式的结点的前驱和后继, 这种指向前驱和后继的指针, 叫线索
对二叉树以某种次序进行遍历并加上线索的过程叫做线索化线索化了的二叉树称为线索二叉树
广义表简称表, 是零个或多个原子表所组成的有限序列
有向图的极大强连通子图, 称为有向图的强连通分量
该结点到树根之间的路径长度与结点上权的乘积
在一个已排好序的记录子集的基础上, 每一步将下一个待排序的记录有序地插入到已排好序记录的子集上, 直到将所有待排记录全部插入为止
一个结点的祖先是指从根结点到该结点的路径上的所有结点
数据结构是数据元素的集合以及定义在该集合上的关系
子串的定位操作称作串的模式匹配
是单链表的另一种形式, 它是一个首尾相接的链表, 表中最后一个结点的指针域由null改为指向头结点或线性表的第一个结点, 整个链表形成了一个环.
在二叉树的存储结构中, 必有N+1个空域, 利用这些空域存放某种遍历的前驱和后继, 其中指向前驱和后继的指针叫线索.
图是顶点与边的集合一般表示为一个二元组, 即, 图G=(V, E), 各个顶点之间是多对多的关系
对于顺序存储的有序表, 先取中间位置的记录关键字与所给的关键字进行比较, 若相等, 则查找成功, 否则, 若给定的关键字比中间的关键字大, 在原表的后半部分比较, 反之, 在原表的前半部分比较, 如此反复, 逐步缩小范围, 直到找到为止, 或找不到, 最后查找范围为空.
在图G的所有生成树中, 树权值最小的那棵生成树, 称作最小生成树.
首先访问出发点v, 接着依次访问v的所有邻接点w1, w2, …, wt, 然后再依次访问与wl, w2, …, wt邻接的所有未曾访问过的顶点依此类推, 直至图中所有和源点v有路径相通的顶点都已访问到为止此时从v开始的搜索过程结束
(若G是连通图, 则遍历完成;否则, 在图C中另选一个尚未访问的顶点作为新源点继续上述的搜索过程, 直至G中所有顶点均已被访问为止)
对满二叉树的结点从上到下, 从左到右进行依次进行编号, 若有一棵二叉树的每一个结点都与深度为K的满二叉树中编号都一一对应时, 只是最后一层不满, 称做完全二叉树
任何一个字符的编码都不是另一个字符编码的前缀, 这种编码叫做前缀编码
是零个或多个原子表所构成的有序序列
利用二叉树的一些空闲指针指向该结点的前驱或后继, 这种指针叫线索, 线索后了的二叉树, 称为线索二叉树
树中所有结点的层次的最大值
同一层上不同双亲的结点, 互称堂兄弟
度为 # 的结点, 即没有后继的结点
M棵互相不相交的树构成的集合, 将一棵非空树的根结点删除, 树就变成了森林
树中每个结点到根结点的路径长度之和
树中所有叶子结点的带权路径长度之和
设有N个权值的结点构造一棵有N个叶子结点的二叉树, 其中WPL最小的那棵树, 为哈夫曼树
一般以N种字符出现的频率做权值, 构造哈付曼树, 左孩子边做0, 右孩子边做1, 那么从根到叶子结点经过的0和1序列, 构成了哈夫曼编码
顶点V的度是图中和顶点V相关联的边的数目包括入度和出度两种
图G=(V, E)与图G1=(V1, E1), 若V1包含于V, 且E1包含于E, 则G1是G的子图
对于无向图, 若V1到V2有路径, 称V1V2是连通的, 若图中任意两点都是连通的, 则称该无向图是连通图
图的弧或边有与它相关的有意义的数, 称作权, 带有权值的图称作网
类似树的先序遍历, 在图中任选一个顶点作为出发顶点V0, 访问V0后, 依次从V0的没被访问过的邻接点出发进行深度优先搜索直到与V0所连通的所有顶点均被访问如果, 此时图中还有顶点尚未访问, 则从剩余的顶点中再任选一个顶点作为出发顶点V0, 重复上述过程, 直到图中全部顶点均被访问为止
除了第一个顶点和最后一个顶点之外, 其余顶点均不相同的回路称为简单回路
在用一个顶点序列表示一条路径时, 若序列中没有相同的顶点重复出现, 则称其为简单路径
根据给定的关键字值, 在特定的表中, 确定一个其关键字与给定值相同的数据元素, 并返回该数据元素在列表中的位置这个过程叫查找
为确定数据元素在表中的位置, 需和给定值进行比较的关键字个数的数学期望值, 成为查找算法在查找成功的平均查找长度
它或是一棵空树, 或是有下面性质的树:若左或右子树不空, 左子树所有结点值小于根结点, 而右子树所有结点值大于根结点的值, 其左右子树也是二叉排序树
对于给定的关键字K, 从线性表的第一个(或最后一个)元素开始, 依次向后(或前)与元素的关键字比较, 若某个记录的关键字与K 相等, 查找成功, 否则失败
或是一棵空树, 或左右子树高度差的绝对值小于等于1而且, 左右子树也是平衡二叉树
在一个已排好序的基础上, 每一步将下一个待排序记录插到已排好记录的子集上, 使之重新有序, 直到所有待排记录插完为止
分块查找以前两个为基础, 将待查记录分成若干块, 每块的关键字无序, 但每块的关键字的最大值有序, 查找时, 先查找到待查记录所在的块, 再在块内进行顺序查找找块时, 即可以用折半查找, 也可用顺序查找
由某个集合上的偏序集得到该集合上的一个全序, 这个操作叫做拓扑排序
将两个或两个以上的有序表合并成一个新的有序表, 开始将每个元素当成是一个个单独的有序表, 逐渐表个数以原来一半的速度递减, 每个表的长度却是原来长度的2倍增加, 不断重复, 直到最后是一个表, 而表的长度是元素个数为止
根据关键字的递减或递增的次序, 把文件中的各个记录依次排列起来, 可使一个无序的数据元素序列变成一个有序的序列的操作
它是插入排序的一种, 又叫缩小增量排序, 先按增量进行分组, 组内插入排序, 然后每次缩短增量, 再进行分组和组内插入排序, 直到增量为1时, 进行最后一次排序止
指的是待排序记录存放在计算机存储器中进行的排序过程;
指的是待排序记录的数量很大, 以致内存一次不能容纳全部记录, 在排序过程中对外存进行访问的排序过程
假设Ki=Kj(1≤i≤n, 1≤j≤n, i≠j), 且在排序前的序列中Ri领先于Rj(即i<j)若在排序后的序列中Rj 领先于Ri , 则称所用的排序方法是不稳定的
假设Ki=Kj(1≤i≤n, 1≤j≤n, i≠j), 且在排序前的序列中Ri领先于Rj(即i<j)若在排序后的序列中Ri仍领先于Rj, 则称所用的排序方法是稳定的
第1遍, 将初始文件中的记录R1看作有序子文件, 将R2插入这个子文件中若R2的关键字小于R1的关键字, 则R2插在R1的前面, 否则R2插在R1的后面第2遍, 将R3插入前面的两个记录的有序子文件中, 得到3个记录的有序子文件依此类推, 继续进行下去, 直到将Rn插入到前面的n-1个记录的有序子文件中, 最后得到n个记录的有序文件
气泡排序的过程很简单从第一记录开始, 相邻的两个记录关键字进行比较, 若顺序不对, 立即交换, 直至N-1个与第N个比较为止得到一个最大(或最小)的关键字记录的结果位置
选择排序是每一趟在n-i+# (i= # , # , 3…n-# )个记录中选择关键字最小的记录作为有序序列中第i个记录其中最简单的是简单选择排序
快速排序的基本思想是把当前待排序的记录, 存放到整个表排好序后, 它应当在的最终位置上将原来的待排序表分割成两部分, 其中一部分表中的关键字均比另一部分表中的关键字小然后, 分别对两部分表用同样的方式进行排序, 直到整个表排好序
首先将根结点的记录与当前树中具有最大序号的记录交换, 把交换后具有最大序号的记录输出, 得到一个排序的结果这时的树不再是堆树, 排序暂时停止然后, 必须把树重新调整成堆树, 再重复上述过程, 直到所有记录都排好序
归并排序是把两个或两个以上的有序表合并成一个新的有序表把含有N 个记录的无序表当成N 个有序的子表, 每个子表的的长度为1, 然后, 利用两两归并, 得到n/2个长度为2或1的有序子表再两两归并直到得到长度为N 的一个有序表
对于一个有向图, 每两个顶点之间都有路径, 称该图为强连通图
对于一个无向图, 其极大连通子图叫做该图一个连通分量
基数排序是借助 “分配” 和 “收集” 两种操作对单逻辑关键字进行排序的一种内排序方法
作者: 我叫史迪奇
本文来自于:
https://sdq3.link/DataStructure-Mustback.html博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议