基本概念
程序 = 数据结构 + 算法
数据 是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。
数据对象 是性质相同的数据元素的集合,是数据的一个子集。
数据类型 是一个值的集合和定义在此集合上的一组操作的总称。
- 原子类型。其值不可再分的数据类型。
- 结构类型。其值可以再分解为若干分量的数据类型。如:C语言中的结构体
抽象数据类型(ADT)是抽象数据组织及与之相关的操作。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
数据结构三要素:
- 逻辑结构:数据元素间的逻辑关系是什么
- 物理结构(存储结构):如何用计算机表示数据元素的逻辑关系
- 数据的运算:施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。
逻辑结构
集合
线性结构
:数据元素之间是一对一的关系。树形结构
:数据元素之间是一对多的关系。图状结构(网状结构)
:数据元素之间是多对多的关系。
物理结构或存储结构
数据结构在计算机中的表示(又称映像)称为数据的物理结构。
顺序存储
:逻辑上相邻的元素在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。链式存储
:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。索引存储
:存储元素信息的同时,还建立附加的索引表。散列存储
:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储
。
算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。算法特性:
- 有穷性
- 确定性
- 可行性
- 输入
- 输出
线性表
- 线性表的
顺序表示
指的是用一组地址连续的存储单元依次存储线性表的数据元素。 - 线性表的
链式存储结构
的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。结点(node)。
链式存储结构
单链表
链表的每个结点中只包含一个指针域,故又称线性链表或单链表。循环链表
双向链表
结点中有两个指针域,其一指向直接后继,另一指向直接前趋。
栈和队列
栈实现的是一种后进先出
(last-in,first-out,LIFO)策略。
栈上的 INSERT 操作称为压入(PUSH),而无元素参数的 DELETE 操作称为弹出(POP)。
队列实现的是一种先进先出
(first-in,first-out,FIFO)策略。
数组和广义表
数组是在内存中存储相同数据类型的连续的内存空间。
树
树作为一种树状的数据结构,其数据节点之间的关系也如大树一样,将有限个节点根据不同层次关系进行排列,从而形成数据与数据之间的父子关系。常见的数的表示形式更接近“倒挂的树”,因为它将根朝上,叶朝下。
基本术语
- 祖先结点:从根到该结点的所经分支上的所有结点。
- 子孙结点
- 双亲结点:B 结点是 A 结点的孩子,则 A 结点是 B 结点的双亲。
- 孩子结点
- 兄弟结点:同一双亲的孩子结点。
- 结点的度:结点子树的个数。
- 树的度: 树中最大的结点度。
- 分支结点:度不为 0 的结点。
- 叶子结点:度为 0 的结点。
- 结点层:根结点的层定义为1(或0);根的孩子为第二层结点,依此类推。
- 结点高度:从叶节点由下到上数。
- 结点深度:从根结点由上到下数。
- 树的高度(深度):树中结点的层数。
- 有序树:子树有序的树,如:家族树。
- 无序树:不考虑子树的顺序。
- 路径:两个结点之间所经过的结点序列。
- 路径长度:所经历边的个数。
- 森林:n 棵互不相交的树的集合。
树的性质
- 树中的结点数等于所有结点的度数加 1。
二叉树
树可以衍生出许多的结构,若将指针域设置为双指针,那么即可形成最常见的二叉树,即每个结点最多有两个子树的树结构。二叉树根据结点的排列和数量还可进一度划分为完全二叉树、满二叉树、平衡二叉树、红黑树等。
将二叉树从上到下,从左到右依次编号。对于编号为 i 的结点,其双亲的编号为 i/2,左孩子为 2i,右孩子为 2i + 1。
二叉树由3个基本单元组成:根节点、左子树、右子树。
遍历二叉树
若限定先左后右,则有 3 种情况,先序遍历、中序遍历、后序遍历。
先序遍历
:根左右
中序遍历
:左根右
后序遍历
:左右根
- 满二叉树:除了最后一层,其它层的结点都有两个子结点。
- 完全二叉树:除了最后一层结点,其它层的结点数都达到了最大值;同时最后一层的结点都是按照从左到右依次排布。
二叉排序树
:又称二叉查找树或二叉搜索树。若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值。平衡二叉树
:又称AVL树。任意结点的左子树和右子树的深度差不超过 1。红黑树
- B树
- B+树
红黑树具有五个特性:
- 每个结点要么是红的要么是黑的。
- 根结点是黑的。
- 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。
- 如果一个结点是红的,那么它的两个儿子都是黑的。
- 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。
散列表
散列表也叫哈希表,是一种通过键值对直接访问数据的结构。
图
图结构一般包括顶点和边,顶点通常用圆圈来表示,边就是这些圆圈之间的连线。边还可以根据顶点之间的关系设置不同的权重,默认权重相同皆为1。此外根据边的方向性,还可将图分为有向图和无向图。
字符串
计算机上的非数值处理的对象基本上是字符串数据。