目录
程序=数据结构+算法
一、算法基础
1. 算法的特性
1) 输入输出
算法具有零个或者多个输入,同时,算法具有至少一个的输出。
对于在屏幕上打印”Hello World”一样,你可以不需要有任何的输入,直接输出得到结果即可,而对于一个没有输出的算法,没有任何意义。
2) 确定性
算法的每一步都具有确定的含义,无二义性。任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得到相同的输出。
请注意,如果算法的目的是产生一个随机数字,每一次运行产生了不同的结果,看上去好像违反了算法确定性原则,但计算机产生随机数亦是使用一种(或多种)算法解决,以线性同余产生随机数为例,其利用了CPU时间的不同产生的不同的结果,当CPU的时间完全一样的时候依旧会产生相同结果,只不过人类无法察觉到如此精确的时间区别。
3)有穷性
一个算法总是需要(输入合法的情况下)在有限的步骤结束,即每个算法需要在有穷的时间内完成。
这是算法与程序的最主要的区别,程序可以无限制循环的执行下去。对于此,你可以理解为一个算法必须要有一个”边界“,即使一个算法需要计算机连续运算50年,但依旧是有穷的,只不过这个算法意义已经不是很大了。
4)可行性
一个算法是可以被执行的,即算法中的每个操作都可以通过已经实现的基本运算执行有限的次数完成。
尽管在目前计算机解存在着没有实现成功的极为复杂的算法,但是并不能说的上是无法实现,只不过是受到现在的工具和人类的大脑限制了,这属于理论研究的范围。
2. 算法设计要求
1) 正确性
正确性(Correctness)指的是该算法能够满足预先指定的功能与性能的需求,即能够得到正确答案。
其大致可以分为以下四点:
a)该算法中不含任何语法错误。
b)程序对于几组输入数据能够得到满足需求的结果。
c)程序对于非法的输入也能够得到满足需求说明的结果(如抛出异常)。
d)程序对于精心挑选的严苛数据依旧能够产生满足需求的结果。
2)健壮性
健壮性(Robustness)指的是当输入数据不合法时,算法也能做出相关的处理,而不是产生不可预计的效果。
3)可读性
可读性(Readability)指的是算法是可以阅读,理解和交流的。
4)耗时低,占用空间少
运行时间(Running time)与占用空间(Storage space)概念,在设计算法时,我们总是希望能够更少的使用时间和空间达成我们的目标。
二、数据结构基础
1. 基本概念和术语
1)数据
数据(Data)是信息的载体,是可以被计算机识别,存储并加工处理的描述客观事物的信息符号的总称。数据不仅仅包括了整形,浮点数等数值类型,还包括了字符甚至声音,视频,图像等非数值的类型。
2)数据元素
数据元素(Data Element)是描述数据的基本单位,也被称为记录。一个数据元素有若干个数据项组成。
如禽类,鸡鸭都属于禽类的数据元素。
3)数据项
数据项(Data Item)是描述数据的最小单位,其可以分为组合项和原子项:
a)组合项
如果数据元素可以再度分割,则每一个独立处理单元就是数据项,数据元素就是数据项的集合。
b)原子项
如果数据元素不能再度分割,则每一个独立处理的单元就是原子项。
4)数据对象
数据对象(Data Object)是性质相同的一类数据元素的集合,是数据的一个子集。数据对象可以是有限的,也可以是无限的。
5)数据结构
数据结构(Data Structures)是相互之间存在一种或多种特定关系的数据元素的集合。
2. 四大逻辑结构(Logic Structure)
1) 集合结构
集合结构(Set Structure)中所有数据元素除了同属于一个集合外,并无其他关系。
如图:
2) 线性结构
线性结构(Linear Structure)指的是数据元素之间存在“一对一的关系”
如图:
除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
3) 树形结构
树形结构(Tree Structure)指的是数据元素之间存在“一对多”的层次关系。
如图:
如文件目录,思维导图等都是树状结构。
4) 图形结构
图形结构(Graphic Structure,也称:网状结构)指的是数据元素之间存在“多对多的关系”(注:此时的“多对多”中的多表示,至少有一个)
图示:
如微信好友关系就是图状结构。
3.物理结构
1)顺序存储
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元邻接关系来体现。
2)链式存储
逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
3)索引存储
在存储元素信息的同时,还建立附加的索引表。索引表中的每项称为索引项,索引项一般形式是(关键字,地址)。
4)散列存储
根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。
4.数据类型
1) 数据类型
数据类型(Data Type)是高级程序设计语言中的概念,是数据的取值范围和对数进行操作的总和。数据类型规定了程序中对象的特性。程序中的每一个变量,常量或者表达式都属于一种数据类型。
2) 抽象数据类型
抽象数据类型(Abstract Data Type,ADT)只是一个数学模型以及定义在模型上的一组操作。通常是对数据的抽象,定义了数据的取值范围以及对数据操作的集合。抽象数据类型的特征是实现与操作分离,从而实现封装。