数据结构+算法=程序
这句是著名的瑞士计算机科学家沃思(N.Wirth)教授提出的,它解释了程序的本质。这里数据结构是指数据的逻辑结构与存储结构,而算法则是对数据运算的描述。由此可见,程序设计的本质就是针对问题选择一种合适的数据结构与一种好的算法。
1 常用术语
在学习之前,我们要先了解与数据结构有关的常用术语:
数据(data)
是描述客观事物的数、字符以及能输入计算机中并被计算机处理的符号的集合。例如,一个代数方程的求解程序中所使用的数据是整数和实数,而一个文本编辑程序使用的数据是字符串。随着计算机的发展以及计算机应用领域的扩大,数据的含义也随之拓展了。例如,当今计算机可以处理的图形、图像、声音等也都属于数据的范畴。
数据元素(data element )
是数据的基本单位。如表中的一张卡片(表格中的一行)、树中的一个结点、图中的一个顶点等都是数据元素。有时一个数据元素可由若干个数据项(也称为字段、域、属性)
组成,数据项是具有独立含义的最小标识单位,如图书卡片信息中的登录号、书名、作者等。
数据对象(data object)
是具有相同性质的数据元素的集合, 是数据的一个子集。例如,大写字母数据对象就是集合{‘A’,‘B’,…,‘Z’}。
2 结构
2.1 逻辑结构
线性结构
的特征是:数据元素(结点)之间存在着一对一的关系,且结构中仅有一个开始结点和一个终端结点,其余结点都是仅有一个直接前趋和一个直接后继。该结构包括栈、队列和表等。
非线性结构
的特征是:数据元素之间存在着一对多或多对多的关系,即一个结点可能有多个直接前趋和多个直接后继。该结构包括树形结构、图形结构和网状结构等。
2.2 存储结构
①顺序存储方法
:顺序存储方法是把逻辑上相邻的结点存储在物理位置上也相邻的连续存储单元里,由此得到的存结构称为顺序存储结构。它通常是惜助于程序设计语言的数组来描述的。该方法主要应用于线性的数据结构,但非线性的数据结构也可通过某种线性化的方法来实现顺序存储。
②链接存储方法
:链接存储方法是用一组不一定连续的存储单元存储逻辑上相邻的元素,元素间的逻辑关系是由附加的指针域表示的,由此得到的存储结构称为链式存储结构。它通常是借助于程序设计语言中的指针来描述的。
③索引存储方法
:索引存储方法通常是在存储元素信息的同时,还建立附加的索引表。表中的索引项一般形式是:(关键字,地址)。关键字是能唯一标识一个元素的一个数据项或多个数据项的组合。
④散列存储方法
:散列存储方法的基本思想是根据元素的关键字直接计算出该元素的存储地址。
3 算法
程序设计离不开数据的运算,这种运算的过程(或解体的方法)通常称为算法。
3.1 方式
常用的运算方式有:检索、插入、删除、更新、排序等,也就是常说的增、删、改、查、排
。
3.2 原则
算法是由若干条指令组成的有穷序列,其中每条指令表示一个或多个操作。此外,算法还必须满足以下五个原则:
(1)输入
:算法开始前必须给算法中用到的变量初始化,一个算法的输入可以包含零个或多个数据。
(2)输出
:算法至少有一个或多个输出。
(3)有穷性
:算法中每一条指令的执行次数都是有限的,而且每一步都在有穷时间内完成,即算法必须在执行有限步后结束。
(4)确定性
:算法中每一条指令的含义都必须明确,无二义性。
(5)可行性
:算法是可行的,即算法中描述的操作都可以通过有限次的基本运算来实现。
3.3 优劣
求解一个问题可能有多种不同的解法,而算法的好坏直接影响程序的执行效率,且不同算法之间的运行效率相差巨大。因此,我们主要用以下三点评价算法的优劣:
(1)执行算法所消耗的时间,即时间复杂性
。
(2)执行算法所消耗的存储空间,主要是辅助空间,即空间复杂性
。
(3)算法易于理解、易于编程,易于调试等,即可读性
和可操作性
。
其中,时间复杂性最常用于评定一个算法的效率,算法的时间量度记为:T(n) = O(f(n))。
算法的时间复杂度通常按数量级递增排列,依次为:常数阶O(1) 、对数阶O(log2n) 、线性阶O(n) 、线性对数阶O(nlog2n) 、平方阶O(n2) 、立方阶O(n3) 、…k次方阶O(nk) 、指数阶O(2n)和阶乘阶O(n!)等形式。
总结
如有问题欢迎指正
参考:全国高等教育自学考试指导委员会.数据结构[M].北京:外语教学与研究出版社,2012.03