数据结构
数据结构基本概念和术语
数据、数据元素和数据项
- 数据:所有被计算机存储、处理的对象。
- 数据元素:数据的基本单位,在程序中作为一个整体而加以考虑和处理。数据元素是运算的基本单位,通常具有完整确定的实际意义。数据元素常常又简称为元素。
- 数据项:一般情况下,数据元素由数据项组成。在数据库中数据项又称为字段或域。它是数 据的不可分割的最小标识单位。
总结
从宏观上看,数据、数据元素和数据项实际上反映了数据组织的三个层次,数据可由若干个数据元素组成,而数据元素又可由若干个数据项组成。
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。它包括数据的逻辑结构、数据的存储结构和数据的基本运算。
数据的逻辑结构
- 数据的逻辑结构是指数据元素之间的逻辑关系。所谓逻辑关系是指数据元素之间的关联方式或“邻接关系”。
- 根据数据元素之间的关系,有四类基本的逻辑结构
- 集合
- 线性结构
- 树形结构
- 图结构
- 集合中任意两个结点之间都没有邻接关系,组织形式松散。
- 线性结构中结点按逻辑关系依次排列形成一条“链”,结点之间一个一个依次相邻接。
- 树形结构具有分支、层次特性,其形态像自然界中的树,上层的结点可以和下层多个结点相邻接,但下层结点只能和上层的一个结点相邻接。
- 图结构最复杂,其中任何两个结点都可以相邻接
数据的存储结构
- 数据的逻辑结构在计算机中的实现称为数据的存储结构(或物理结构)。一般情况下,一个存储结构包括以下两个部分
- 存储数据元素;
- 数据元素之间的关联方式;
- 表示数据元素之间的关联方式主要有顺序存储方式和链式存储方式。
- 顺序存储方式是指所有存储结点存放在一个连续的存储区里。利用结点在存储器中的相对位置来表示数据元素之间的逻辑关系。
- 链式存储方式是指每个存储结点除了含有一个数据元素外,还包含指针,每个指针指向一个与本结点有逻辑关系的结点,用指针表示数据元素之间的逻辑关系。
- 除了上述两种存储方式之外,还有索引存储方式和散列存储方式。
- 一种逻辑结构可以采用一种或几种存储方式来表达数据元素之间的逻辑关系,相应的存储结构称为给定逻辑结构的存储实现或存储映像。如何来描述存储结构呢?可以分别在机器级和语言级上讨论。
运算
- 运算是指在某种逻辑结构上施加的操作,即对逻辑结构的加工。这种加工以数据的逻辑结构为对象。一般来说,在每个逻辑结构上,都定义了一组基本运算,这些运算包括:建立、查找、读取、插入和删除等。
- 线性表、栈和队列中的元素具有相同的逻辑结构(即线性结构),但有不同的运算集,它们是不同的数据结构.
算法代码描述不在这里进行研究
算法分析
- 评价算法好坏的因素包括以下几个方面
- 正确性:能正确地实现预定的功能,满足具体问题的需要。
- 易读性:易于阅读、理解和交流,便于调试、修改和扩充。
- 健壮性:即使输入非法数据,算法也能适当地做出反应或进行处理,不会产生预料不到的运行结果。
- 时空性:一个算法的时空性是指该算法的时间性能(或时间效率)和空间性能(或空间效率), 前者是算法包含的计算量,后者是算法需要的存储量。
时间复杂度
1.大 O 表示法
- 大 O 表示法的具体提法是:当且仅当存在正常数 c 和 n0,使得 T(n)≤cf(n) 对所有 n>n0 成立。其中,f(n)为问题规模 n 的某个函数。
- 大 O 表示法也称渐进表示法,它不考虑具体的运行时间,只给出算法在问题规模 n 下执行时间的上界。
- T(n) =O(f(n))称为算法的渐进时间复杂度,简称时间复杂度。
- 如:T(n)=O(n2),这种表示法称为大 O 表示法,它的含义是:当 n 充分大时,算法的执行时间与 n2 成正比。
2.时间复杂度常见的阶数
- 常数阶 O(1)(即算法的时间复杂度与输入规模 n 无关);
- 对数阶 O(log2n);
- 线性阶 O(n);
- 多项式阶 O(nC),C 为大于 1 的正整数,常见的多项式阶有 O(n2)和 O(n3);
- 指数阶 0 (Cn),C 为大于 1 的正整数,常见的指数阶有 O(2n)。
通常认为,时间复杂度具有指数阶的算法是实际不可计算的,而阶数低于平方阶的算法是高效率的。
3.最坏时间复杂度和平均时间复杂度最坏时间复杂度是指,对相同输入数据量的不同输入数据,算法时间用量的最大值。平均时间复杂度是指,对所有相同输入数据量的各种不同输入数据,算法时间用量的平均值。
4.为了比较不同量级时间复杂度的差异,下表为不同时间复杂度阶数 f(n)在每秒 20 亿个程序步的计算机上运行所需要的时间。
空间复杂度
1.—个算法的空间复杂度定义为该算法所耗费的存储空间,它也是问题规模 n 的函数。通常可记为:S(n) =0(g(n)) 其中,g(n)为问题规模 n 的某个函数。
2.空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在执行期间所需要的存储空间量应包括以下三个部分:
- 程序代码所占用的空间;
- 输入数据所占用的空间;
- 辅助变量所占用的空间,在估算算法空间复杂度时,一般只需要分析辅助变量所占用的空间。