数据结构的重要性
对于非数值计算程序,由于数据间关系复杂,数据量大,因此对于良好数据结构的要求要高于对于算法的要求。
数据结构的讨论层次
- 抽象层:讨论数据的逻辑结构和所需的运算;
- 实现层:讨论数据的存储表示和运算的实现。
数据的逻辑结构
- 集合结构:元素间的次序是任意的;
- 线性结构:元素之间构成有序序列,除头尾元素外,其余元素都有一个前驱和一个后继;
- 树形结构:元素之间构成层次关系,除根元素没有前驱外,每个元素都有一个前驱和若干个后继;
- 图形结构:最一般的逻辑结构,每个元素的前驱和后继数目都不限。
数据结构的运算
- 创建运算(Create):创建一个空的数据结构;
- 清除运算(Clear):删除数据结构中的所有数据元素;
- 插入运算(Insert):在数据结构的指定位置上插入一个新的数据元素;
- 删除运算(Remove):将数据结构中的某个数据元素删除;
- 搜索运算(Search):在数据结构中搜索满足特定条件的数据元素;
- 更新运算(Update):修改数据结构中的某个数据元素;
- 访问运算(Visit):访问数据结构中的某个数据元素;
- 遍历运算(Traverse):按照某种次序访问数据结构中的每一个数据元素, 使每个数据恰好被访问一次。
存储实现
- 数据运算的实现通常称为运算实现;
数据元素之间的逻辑关系实现通常被称为存储实现。 - 一个物理结构通常由以下三部分组成:
- 存储节点,每个节点存放一个数据;
- 数据元素之间关系的存储,也就是逻辑结构的机内表示;
- 附加信息,为方便运算而设置的一些“哑节点”,如链表中的头节点。
- 存储节点之间的关联有以下4种实现方式:
- 顺序实现:存储节点放在连续的存储区域, 节点逻辑关系通过存储位置体现;
- 链接实现:存储节点分散在存储器的不同位置,节点关系通过指针显式指出;
- 散列存储:专用于集合的存储方式,各节点均匀地分布在一块连续的存储区域内, 用一个散列函数将数据元素和存储位置关联起来;
- 索引存储:所有的存储节点按照生成顺序连续存放, 另设置一个索引区域表示节点之间的关系。
算法分析
- 算法质量的评判标准:
- 正确性:正确实现预定功能;
- 易读性:易于阅读和理解, 便于调试、修改和扩充;
- 健壮性:算法能够对于环境变化作出处理,不产生不正确的运算结果;
- 高效性:具有较高的时间和空间性能。
- 算法分析:确定算法的时空性能
- 时间性能(或时间复杂度):算法的计算量;
- 空间性能(或空间复杂度):算法的存储量;