(未完待续)
数据结构
:
逻辑次序
线性结构
半线性结构
非线性结构
序列(sequence)
:最基本的线性结构的统称。
序列(sequence)依据数据项之间的逻辑次序与其物理存储的对应关系不同,又可以进一步划分向量和列表:
向量(vector)
:所有数据项之间物理存储位置与逻辑次序完全吻合。此时的逻辑次序也称为秩(rank)
循秩访问(call-by-rank)
,静态存储策略。列表(list)
:所有数据项之间物理存储位置与逻辑次序不一定吻合。采用间接定址的方法通过封装后的位置(position)
相互引用。
循位置访问(call-by-position)
或者称为循链接访问(call-by-link)
,动态存储策略。栈(stack)
:线性数据结构的一种,视作向量与列表的特例。对象的插入和删除限制在栈的一端。禁止操作的一端称为盲端
。栈顶(stack top)
:可操作(插入和删除)的一端。入栈(push)
与出栈(pop)
。栈底(stack bottom)
:无法直接操作的盲端。
调用栈(call stack)
和执行栈(execution)
:大部分操作系统中,每个运行的二进制程序都都配有一个调用栈,用来跟踪属于同一个程序的所有函数,记录它们之间的调用关系,并保证在每一个调用实例执行完毕之后,可以准确返回。帧(frame)
:调用栈的基本单位,每次函数调用时,都会相应的创建一帧:
进制转换
栈混洗(stack permutation)
:栈的数据从stackA——>stackS——>stackB。
括号匹配:
延迟缓冲:
逆波兰表达式(reverse Polish notation,RPN)
:
剪枝
试探
回溯
视作向量与列表的特例
队列(queue):线性数据结构的一种,对象的插入和删除限制在队列的两端。队头(front)
:允许取出元素的一端。出队(dequeue)
:元素的删除操作。队尾(rear)
:允许插入元素的一端。入队(enqueue)
:元素的插入操作。
叶节点(leaf)
:无孩子的节点。树的高度(height)
:树的所有节点深度的最大值称作该树的高度。教材中约定,单个节点的树高度为0,空树的高度为-1。
节点的高度
:任一节点V的高度对应于子树的高度
subtree(V)。
k叉树(k-ary tree)
:每个节点的孩子均不超过k个的有根树。
父节点表示法
:一个向量表,存两个属性,一个是data,一个是parent孩子节点表示法
:一个向量表,存两个属性,一个是data,一个是children(组织成vector或者list)父亲+孩子节点表示法
:一个向量表,存三个属性,一个是data,一个是parent,最后一个是children(组织成vector或者list)
有序树(ordered tree):同一节点的所有孩子之间必须具有某一线性次序。这个约束条件使得作为多叉树特例的二叉树有足够的能力表示任何一颗多叉树。
同一列的是长子,同一行的是兄弟
二叉树(binary tree)
:每个节点的读书均不超过2。有序二叉树(ordered binary tree)
:同一父节点的孩子都可以左右相互切分。真二叉树(proper binary tree)
:不含一度节点的二叉树
完全二叉树(complete binary tree):
递归式遍历
迭代版先序遍历
迭代版中序遍历
迭代版后续遍历
层次遍历
编码
解码
前缀无歧义编码(PFC)
huffman编码
根通路串(root path string)
对线性数据结构查找性能的改进。
如果既要求对象集合的组成可以高效率地动态调整,同时也要求能够高效率的查找,对于向量和列表这类线性结构是难以胜任的。
兼顾高效率的动态修改和高效率的静态查找,可以使用搜索树。
理想平衡和适度平衡,引入平衡二叉树结构,比如AVL树即使在最坏情况下,单次动态查找和静态查找也均在O(log n)时间内完成。
理想平衡:如果树的高度恰好为log n,向下取整,则成为理想平衡树 ,比如完全二叉树和满二叉树
适度平衡:渐进意义下适当放松标准的平衡性。渐进的不超过O(log n)
下面介绍的红黑树,AVL树,伸展树,kd-树都是适度平衡的变种。也可以归入平衡二叉搜索树之列。
二叉搜索树(binary search tree)
:处处都满足顺序性——任一节点r的左(右)子树中,所有节点均不大于(不小于)节点r二叉搜索树的判定
:任何一棵二叉树是二叉搜索树,当且仅当其中序遍历序列单调非降。
复杂度分析:
insert,remove,search时间:线性正比于查找路径的长度或者最终返回节点的深度。最坏情况下可能退化成为链表。
若两个二叉搜索树的中序遍历相同,则称它们彼此等价。
概括一下就是:上下可变,左右不乱。也就是说节点的左右相对关系是不变的,但是上下关系是可以改变的。
局部性:
zig
顺时针旋转zag
逆时针旋转
平衡因子(balance factor)
:其左,右子树的高度差。
各个节点的平衡因子绝对值不超过1。也就是各个节点左右子树高度差不超过1。
失重与重新平衡:
单旋与双旋:
统一重平衡算法:
伸展树(splay tree):
利用了数据局部性,将刚刚被访问的节点,转移至树根附近。
伸展(splaying)
:随着节点e的不断上升,两侧子树的结构也在不断的调整,这种过程也形象地称为伸展。
节点e每次提升1层,直至成为树根
节点e每次提升2层,直至成为树根。
zig-zig/zag-zag
zig-zig/zag-zag
zig/zag
复杂度分析:分摊的情况下,O(log n)
通过假想地引入外部节点(黑色),将二叉树真正扩展为真二叉树。
所有外部节点的黑高度统一
特别的,根节点的黑高度也称为全树的黑高度,在数值上与外部节点的黑高度相等。
所有外部节点的黑高度为0.
双红修正
双黑修正
平衡二叉搜索树(BBST)的推广
当数据规模大到内存已经不足以容纳时候,常规平衡二叉搜索树的效率会大打折扣。其原因在于查找过程对外存的访问次数过多。
外部存储适合于批量式访问,不妨通过时间成本较低的多次内存操作,来替代时间成本相对较高的单次外存操作。
结合上面的思想,我们可以将通常的二叉树搜索树,改造为多路搜索树(等价变换)
四路搜索树
:每个大节点拥有四个外部的分支。
多路搜索树(multi-way search tree)
:一般地,以k层为间隔如此重组,可以将二叉搜索树转化为等价的2^k路搜索树。
优点:
平衡多路搜索树的典型代表
B-树(B-tree):m阶B-树,也就是m路平衡搜索树
所有外部节点的深度都相等,每个内部节点都存有不超过m-1个关键码,以及用以指示对应分支不超过m个引用。
各个节点的分支数应该介于m/2(向上取整)与m之间,故也称为(m/2向上取整,m)-树
B-树的外部节点:
B-树的宽度
B-树的叶节点
复杂度:O(logmN)
四叉树与八叉树的一般性推广
递归定义的平衡二叉树
一维范围查询(range query):给定直线L上的点集P={p0,pn-1},对于任一区间R=[x1,x2],P中的哪些顶点落在其中?
离线方式和在线方式输出敏感(output sensitive)
的算法
平衡二叉搜索树解决一维度范围i查询问题, 找到最低共同祖先,忽略
分割成为矩形,举行左边底边开,右边和顶边封闭
每次切分都在中位点(对应的坐标排序居中者)。 以保证全树的高度不超过O(log n)
复杂度O(根号n)
非线性结构
二叉堆是一种特殊的完全二叉树,分为最大堆和最小堆。最大堆:
,任何一个父节点的值,都大于或等于它左、右孩子节点的值。最小堆:
,任何一个父节点的值,都小于或等于它左、右孩子节点的值。
看这篇文章即可:哈希表(散列表)详解
偏序只对部分元素成立关系R,全序对集合中任意两个元素都有关系R。
数据结构 邓俊辉
Update your browser to view this website correctly. Update my browser now