1 数据结构及其研究范畴
数据结构是一门研究非数值计算的程序设计问题中计算机操作对象以及它们之间的关系和操作等的学科。1968年美国唐.欧.克努特教授开创了“数据结构”的最初体系,他所著的《计算机程序设计》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。
数据结构的研究范畴包括3个方面:数据的逻辑结构、数据的物理结构(存储结构)和数据的操作,如图1所示。
图1 数据结构的研究范畴
2 算法和算法分析
2.1 算法
算法是解决某一类问题的确定的有限步骤的集合。一个算法具有5个重要特性:有穷性(不能是死循环)、确定性(无二义)、可行性(在当前的社会环境下可行)、输入和输出。
2.2 算法设计的要求
通常设计一个“好”的算法应考虑达到以下目标。
(1)正确性(correctness)算法应当满足具体问题的需求。要保证一个算法是正确的是一件非常困难的事情,有时候甚至是不可能的,只能是“相对”正确,通常通过设计一些具有代表性的合法的和非法的输入数据来测试,这需要涉及软件测试的相关知识。
(2)可读性(readability)算法主要是为了人的阅读与交流,其次才是机器执行。设计一个可读性好的算法是一种艺术,更是设计者智慧的体现,可以参照软件设计的一些原则。“计算机程序是写给人看的,附带在机器上执行”,“大道至简”都是经典的论述。
(3)健壮性(robustness)当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。个人理解,这涉及到人机交互友好性问题。
(4)效率与低存储要求,就是省时又省空间。有些时候,省时和省空间是相互矛盾的,这时我们老祖先们的思想就派上用场了,“中庸”是解决问题最佳方法,在计算机系统的设计中,中庸的思想贯穿始终,折中、权衡这些词就是好用!
2.3 算法效率度量
算法效率可以从时间和空间两大角度加以度量。时间角度就是我们耳熟能详的大O分析法,在大O分析法中,输入的大小假设是一个未知的值n。大O分析法关注的是在n变得非常大的时候的渐近运行时间。算法可以按如下进行分类,性能有好到坏:
O(1)——如果一个算法运行时间与输入大小n无关,则称为常数阶。
O(logn)——如果一个算法的运行时间与输入大小成对数增长,则称为对数阶。
O(n)——如果一个算法的运行时间与输入大小成线性增长,则称为线性阶。
O(nlogn)——线性对数阶的算法介于线性阶和多项式阶算法之间。
O(n的c次方)——多项式阶的算法随着输入大小的增大而快速增长。
O(c的n次方)——指数阶的算法比多项式阶的算法增长更快。
O(n!)——阶乘阶的算法是增长最快的,由于运行时间增长太快,因此即使对n很小时也不可用。
算法的空间效率分析涉及到所占用的存储空间和存取数据所用的时间。占用的存储空间少一点好,没人会希望一个算法就撑爆自己的内存吧,而对于存取时间,我个人理解用程序的局部性原理来解决,条件允许的情况下,尽量将数据存放于存储器体系结构(就是那个金字塔)的塔尖或者靠近塔尖的位置。