1 基本概念和术语
- 数据(Data):是客观事物的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。
- 数据元素(Data Element):是数据的基本单位,在程序中通常作为一个整体来进行考虑和处理。
- 数据项(Data Item):是数据的不可分割的最小单位。数据项是对客观事物某一方面特性的数据描述,一个数据元素可由若干个数据项组成。
- 数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。如字符集合C={‘A’,‘B’,‘C’,...}。
- 数据结构(Data Structure):是指相互之间具有(存在)一定联系(关系)的数据元素的集合。元素之间的相互联系(关系)称为逻辑结构。数据元素之间的逻辑结构有四种基本类型:
- 集合:结构中的数据元素除了“同属于一个集合”外,没有其它关系;
- 线性结构:结构中的数据元素之间存在一对一的关系;
- 树型结构:结构中的数据元素之间存在一对多的关系;
- 图状结构或网状结构:结构中的数据元素之间存在多对多的关系。
2 数据结构的形式定义
数据结构的形式定义是一个二元组:
Data-Structure=(D,S)
其中D是数据元素的有限集,S是D上关系的有限集。数据元素之间的关系可以是元素之间代表某种含义的自然关系,也可以是为处理问题方便而人为定义的关系,这种自然或人为定义的“关系”称为数据元素之间的逻辑关系,相应的结构称为逻辑结构。
例:设数据逻辑结构B=(K,R)
K={k1,k2,...,k9}
R={<k1,k3>,<k1,k8>,<k2,k3>,<k2,k4>,<k2,k5>,<k3,k9>,<k5,k6>,<k8,k9>,<k9,k7>,<k4,k7>,<k4,k6>}
3 数据结构的存储方式
数据结构在计算机内存中的存储包括数据元素的存储和元素之间的关系的表示。
元素之间的关系在计算机中有两种不同的表示方法:顺序表示和非顺序表示。由此得出两种不同的存储结构:顺序存储结构和链式存储结构。
- 顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素之间的逻辑结构(关系)。
- 链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer),用该指针来表示数据元素之间的逻辑结构(关系)。
数据的逻辑结构和物理结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。
数据结构的三个组成部分:
- 逻辑结构:数据元素之间逻辑关系的描述D_S = (D,S)。
- 存储结构:数据元素在计算机中的存储及其逻辑关系的表现称为数据的存储结构或物理结构。
- 数据操作:对数据要进行的运算。
图1 逻辑结构与所采用的存储结构
图2 数据逻辑结构层次关系图
4 数据结构的运算
数据结构的主要运算包括:
- 建立(Create)一个数据结构;
- 消除(Destroy)一个数据结构;
- 从一个数据结构中删除(Delete)一个数据元素;
- 把一个数据元素插入(Insert)到一个数据结构中;
- 对一个数据结构进行访问(Access);
- 对一个数据结构中的数据元素进行修改(Modify);
- 对一个数据结构进行排序(Sort);
- 对一个数据结构进行查找(Search)。
5 抽象数据类型
抽象数据类型(Abstract Data Type,简称ADT):是指一个数学模型以及定义在该模型上的一组操作。ADT的定义是一组逻辑特性描述,与其在计算机内的表示和实现无关。因此,不论ADT的内部结构如何变化,只要其数学特性不变,都不影响其外部使用。
ADT的形式定义是三元组:ADT=(D,S,P),其中D是数据对象,S是D上的关系集,P是对D的基本操作集。
ADT的一般定义形式是:
ADT<抽象数据类型名>{
数据对象:<数据对象的定义>
数据关系:<数据关系的定义>
基本操作:<基本操作的定义>
}ADT<抽象数据类型名>
6 算法
算法(Algorithm):是对特定问题求解方法(步骤)的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
算法具有以下五个特性:
- 有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
- 确定性:算法中每一条指令必须有确切的含义。不存在二义性。且算法只有一个入口和一个出口。
- 可行性:一个算法是能行的。即算法描述的操作都可以通过已经实现的基本运算执行有限次来实现。
- 输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。
- 输出:一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。
7 算法设计的要求
评价一个好的算法有以下几个标准:
- 正确性(Correctness):算法应满足具体问题的需求。
- 可读性(Readability):算法应容易供人阅读和交流。可读性好的算法有助于对算法的理解和修改。
- 健壮性(Robustness):算法应具有容错处理。当输入非法或错误数据时,算法应能适当地作出反应或进行处理,而不会产生莫名其妙的输出结果。
- 通用性(Generality):算法应具有一般性,即算法的处理结果对于一般的数据集合都成立。
- 效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。一般地,这两者与问题的规模有关。
8 算法效率的度量
算法的时间复杂度:一般地,常用最深层循环内的语句中的原操作的执行频度(重复执行的次数)来表示。“O”的定义:若f(n)是正整数的一个函数,则O(f(n))表示时间复杂度的阶:
- O(1):常量时间阶
- O(n): 线性时间阶
- O(logn): 对数时间阶
- O(nlogn):线性对数时间阶
- O(nk): k≥2,k次方时间阶
图3 时间复杂度计算实例