0 - 数据结构
介绍
数据
数据是用来呈现信息的数字、符号、字母的组合。
数据结构
数据结构是一组数据元素,提供最简单的方式来存储数据、对数据执行不同的操作。数据结构是计算机上一种特殊的数据组织形式,可以对数据进行高效使用。数据结构的思想是降低任务的时间复杂度与空间复杂度。
一个良好的数据结构选择,可以进行实现高效地操作。一个高效的数据结构使用最小的内存空间,并使用最短的时间处理数据。
数据结构也会定义一类抽线数据类型 ADT: Abstract data type
,由三元参数组成:
D
:范围集F
:操作集A
:公理集
数据结构类型:
- 线性数据结构
- 非线性数据结构
线性数据结构:
- 元素以一维形式组织
- 例子:链表、栈、队列,等
非线性数据结构:
- 元素以多维形式组织
- 例子:树、图、表,等
数据结构在不同领域使用:
- 操作系统
- 图形学
- 计算机设计
- 区块链
- 遗传学
- 图像处理
- 仿真学
下面是一些流行数据结构的一个简短介绍:
-
数组
数组是存储在连续内存空间的数据项目集合。它用来将多个相同类型的数据存储在一起。只需要在基地址加上偏置可以计算得到元素的位置。
-
链表
链表是一个线性数据结构,链表数据不存储在连续的存储空间中,元素通过指针连接。
-
栈
栈式一个线性数据结构,遵循后进先出规则,在栈中,入栈与出栈只发生在栈顶。
Initialize
:创建一个空栈Push
:入栈元素,若栈满,产生栈溢出条件Pop
:出栈元素,若栈空,则产生栈下溢条件Peek/Top
:查询栈顶元素isEmpty
:查看栈是否为空,空返回true
isFull
:查询栈是否以满,满返回true
-
队列
队列遵循先进先出,在队列中,入队从一端进行,而出队从另一端进行。
Enqueue
:入队,若队满,产生队列溢出条件Dequeue
:出队,若队空,产生队列下溢条件Front
:队列的头Rear
:队列的尾
-
二叉树
与数组、链表、栈或队列不同,树式具有层级的数据结构。二叉树是树状数据结构,每一个节点最多具有两个子节点,分别称为左子节点与右子节点。它通常是使用链表实现。
二叉树使用树的根节点做引用。如果树为空,那么根节点为
NULL
,一棵二叉树节点包含下面组件:- 数据
- 指向左子节点的指针
- 指向右子节点的指针
-
二叉搜索树
二叉搜索树是具有下面特性的二叉树:
- 左子树的节点值均小于这个节点
- 右子树的节点值均大于这个节点
- 左子树与右子树也构成二叉搜索树
-
堆
堆是特殊的树数据结构,但是堆是一个完全二叉树,一般情况下,堆可以是下面两种类型:
Max-Heap
:在最大堆中,根节点的值总是比它的子节点大,且在子树中递归成立Min-Heap
:在最小堆中,根节点的值总是比它的字节点小,且在子树中递归成立
-
散列
散列设计来使用称为哈希函数的一类特殊函数,使用给定的键值来实现快速元素访问,是否能够高效实现,取决于使用的哈希函数。
比如,一个哈希函数映射
x
在数组中的索引值,它使用x%10
函数实现,那么列表[11, 12, 13, 14, 15]
的数组,分别存储在数组的{1, 2, 3, 4, 5}
偏置位置。 -
矩阵
一个矩阵具有行和列。
-
字典树
字典树是一个高效的信息恢复数据结构。使用字典树,搜索复杂度可以降低到最优。如果我们将值存储在二叉搜索树中,一个平衡二叉树需要时间为
M*logN
,M
为最大字符串长度,N
为树种的值个数。而使用字典树,我们可以在O(M)
时间内搜索到,当然它的代价是存储时的复杂要求。