02 常用数据结构
数据 -> 整理分析(算法 + 数据结构) -> 信息
(1) 基本数据类型(Primitive Data Type):或称标量数据类型(Scalar Data Type)。整数、浮点数、布尔、字符。
(2) 结构化数据类型(Structured Data Type):也称虚拟数据类型(Virtual Data Type)。字符串、数组、指针、列表、文件等。
(3) 抽象数据类型(Abstract Data Type):堆栈等。
-
数组 - Array
一排紧密相邻的可数内存,并提供一个能够直接访问单一数据内容的计算方法。
Two-dimension Array 二维数组 -
链表 - Linked List
由许多相同数据类型的数据,按特定顺序排列而成的线性表。
链表中的数据项在计算机内存中的位置是不连续且随机(Random)存放的。插入和删除都相当方便,查找麻烦。
单向链表,除非必要,否则不可移动链表头指针。 -
堆栈 - Stack
相同数据类型的组合 有序线性表 LIFO 抽象数据类型(ADT)- 创建 create
- 入栈 push
- 出栈 pop
- 是否为空 isEmpty
- 是否已满 full
-
队列
有序线性表 FIFO 抽象数据类型(ADT)
广度优先搜索(BFS),计算机的模拟(simulation),CPU 的作业调度(job scheduling),外围设备联机并发处理的应用
堆栈只需要一个顶端(top),指针指向堆栈点顶端
对列必须使用 front 和 rear 两个指针分别指向队列前端和队列尾端- 创建 create
- 添加 add
- 删除 delete
- 返回前端的值 front
- 是否为空 empty
-
树形结构
二叉空间分割树(BSP tree)
四叉树(Quadtree)
八叉树(Octree)
n 叉树(n-way)
一棵合法的树,节点间可以互相连接,但不能形成无出口的回路。- 度数(Degree):每个节点所有子树的个数。
- 层数(Level)
- 高度(Height):树的最大层数。
- 树叶/终端节点(Terminal Nodes):度数为 0 的节点。
- 父节点(Parent)
- 子节点(Children)
- 祖先(Ancestor)和子孙(Descendent)
- 兄弟节点(Siblings):有共同父节点的节点。
- 非终端节点(Nonterminal Nodes)
- 同代(Generation):在一棵树上具有相同层数的节点。
- 森林(Forest):n 棵(n ≥ 0)互斥树的集合。
- 一般树形结构在计算机中的存储方式是以链表为主。对于 n 叉树来说,因为每个节点的度数都不相同,所以必须为每个节点预留存放 n 个链接字段的最大存储空间。
这种 n 叉树特别浪费链接存储空间。假设 n 叉树有 m 个节点,那么此树共有 n*m 个链接字段。因此,除了树根外,每个非空连接都指向一个节点,所以得知空链接个数为 n*m - (m-1) = m(n-1) + 1,而 n 叉树的链接浪费率为 [m(n-1)+1]/m*n。因此得到一下结论:
n=2 时,二叉树的链接浪费率约为 1/2。
n=3 时,三叉树的链接浪费率约为 2/3。
n=4 时,四叉树的链接浪费率约为 3/4。
... ...
当 n = 2 时,浪费率最低,所以为了改善存储空间浪费的缺点,最常使用二叉树。 - 二叉树 - Binary Tree / Knuth 树
二叉树与一般树的区别:
(1) 树不可以为空集合,但二叉树可以
(2) 树的度数为 d≥0,但二叉树的节点度数为 0 ≤ d ≤ 2
(3) 树的子树间没有次序关系,二叉树则有
-
图形结构
树形结构描述节点间“层次”关系
图形结构讨论两个顶点间”是否连通“
加权图 ——“网络”- 欧拉环(Eulerian Cycle):当所有顶点的度数都是偶数时,才能从某顶点出发,经过每条边一次,再回到起点。
- 欧拉链(Eularian Chain):从某一顶点出发,经过每条边一次,不一定回到起点,则只允许其中两个顶点的度数为奇数,其余则必须全部为偶数。
- 无向图 (V1, V2)
- 有向图 <V1, V2>
-
哈希表
哈希表是一种存储记录的连续内存,通过哈希函数的应用,可以快速存取与查找数据。
哈希法就是将本身键值,通过特定的数学函数运算或应用其他的方法,转换成相对应的数据存储地址。- bucket(桶):哈希表中存储数据的位置,每一个位置对应到唯一的地址(bucket address),桶就好比一个记录。
- slot(槽):每一个记录中可能包含好几个字段,而 slot 指的就是桶中的字段。
- collision(碰撞):两个不同的数据,经过 Hash 函数运算后,对应到相同的地址。
- 溢出:运算后的数据所对应到的 bucket 已满。
- 哈希表:存储记录的连续内存。一种类似数据表的索引表格,可分为 n 个 bucket,每个 bucket 又可分为 m 个 slot。
- 同义词(Synonym):两个标识符 I1 和 I2 经过哈希函数运算后所得的数值相同,即 f(I1) = f(I2),就称 I1 和 I2 对于 f 这个哈希函数是同义词。
- 加载密度(Loading Factor):标识符的使用数量除以哈希表内槽的总数
α(加载密度)= n(标识符的使用数目)/ [ s(每个桶内的槽数)* b(桶的数目)]
α 值越大,表示哈希空间的使用率越高,碰撞或溢出的概率也越高。 - 完美哈希(Perfect Hashing):没有发生碰撞和溢出的哈希函数。
- 原则:
- 降低碰撞和移除的产生
- 哈希函数不宜过于复杂,越容易计算越好
- 尽量把文字键值转换成数字键值,方便计算
- 设计的哈希函数计算得到的值,均匀的分布在每一个桶中