第一章 绪论
1.1 问题求解与程序设计
著名的计算机学者沃思给出了一个公式:数据结构+算法=程序
主要内容:
(1)、数据的逻辑结构:包括表、树、图等数据结构,其核心是如何组织待处理的数据以及数据之间的逻辑关系
(2)、数据的存储结构:如何将表、树、图等数据结构存储到计算机的存储器中,其核心是如何有效地存储数据以及数据之间的逻辑关系
(3)、算法:如何基于数据的某种存储结构实现插入、删除、查找等基本操作,其核心是如何有效地处理数据
(4)、常用的数据处理技术:包括查找技术和排序技术等
1.2 数据结构的基本概念
1.2.1数据结构
数据:所有能输入到计算机中并且能被计算机程序识别和处理的符号集合。可以将数据分为俩大类:一类整数、实数等数值数据;另一类是文字、声音、图形和图像等非数值数据。
数据元素:是数据的基本单位。构成数据元素最小单位称为数据项,而且数据元素通常具有相同个数和类型的数据项。 数据元素与数据的关系——是集合的个体。
数据对象:性质相同的数据元素集合。 数据对象与数据的关系——是集合的子集。
数据结构:指相互之间存在一定关系的数据元素的集合。数据元素之间的相互关系称为结构。需要强调的是,数据元素是讨论数据结构时涉及的最小数据单位,其中的数据项一般不给予考虑。按照观点的不同,数据结构分为逻辑结构和存储结构。
数据的逻辑结构是指数据元素以及数据元素之间的逻辑关系,是从实际问题抽象出的数据模型,在形式上可定义为一个二元组:Data_Structure = (D,R) 其中,D是数据元素的有限集合,R是D上关系的集合。
逻辑结构的划分:
(1)线性结构:有且仅有一个开始和一个终端节点,并且所有节点都最多有一个直接前驱和一个直接后继。例如:线性表、栈、队列、串。
(2)非线性结构:一个结点可能有多个直接前驱和直接后继。例如:树、图。
根据数据元素之间的逻辑关系的不同,数据结构可分为以下四类:
- 集合:数据元素之间就是“属于同一个集合”,除此之外,没有任何关系。
- 表结构:数据元素之间存在着一对一的线性关系。
- 树结构:数据元素之间存在着一对多的层次关系。
- 图结构:数据元素之间存在在多对多的任意关系。
树结构和图结构也称为非线性结构。
通常用逻辑结构图来描述数据的逻辑结构。
数据的存储结构又称为物理结构,是数据以及逻辑结构在计算机中的表示(也称为映像)。
存储结构有俩种存储结构:顺序存储结构和链式存储结构。
顺序存储结构:一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系有元素的存储的位置来表示。
链式存储结构:一组任意的存储单元存数据元素,数据元素之间的逻辑关系用指针来表示。
数据结构的两种存储结构图
数据的逻辑结构是从具有问题抽象出来的数据模型,是面向问题的,反映了数据元素之间的关联方式或邻接关系。
数据的存储结构是面向计算机的,其基本目标是将数据及其逻辑关系存储到计算机的内存中。
一种数据的逻辑结构可以用多种存储结构来存储,而采用不同的存储结构,其数据处理的效率往往是不同的。
1.2.2抽象数据类型
数据类型:是一组值的集合以及定义于这个值集上的一组操作的总称。数据类型规定了该类数据的取值范围以及能够执行的操作。
抽象:就是抽出问题本质的特征而忽略非本质的细节,是对具体事情的一个概括。
抽象数据类型:是一个数据模型以及定义在该模型上的一组操作的总称。
1.3算法的基本概念
1.3.1算法及算法的特性
算法:对特定问题求解步骤的一种描述,是指令的有限序列。
算法必须满足以下基本特性:
- 有穷性
- 确定性
- 可行性
- 正确性
- 健壮性
- 可理解性
- 抽象分级性
- 高效性
1.4算法分析(时间复杂度)重难点
常见的时间复杂度:
O() < O(N) < O(N
) < O(
) < O(
) < O(
) < O(n!)
算法在运行过程中需要的存储空间包括:
- 输入\输出数据占用的空间;
- 算法本身占用的空间;
- 执行算法需要的辅助空间;
算法的空间复杂度:指算法在执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的存储空间。
1.4.1算法分析举例
1.非递归算法的时间复杂
(1)
x++;
解:x++是基本语句,执行次数为1次,所以时间复杂度为O(1),称为常量阶。
(2)
for(i = 1; i <= n; i++)
++x;
解:++x是基本语句,执行次数为n次,所以时间复杂程度为O(n),称为线性阶。
(3)
for(i = 1; i <= n;i++)
for(j = 1; j<= n;j++)
++x;
解:++x是基本语句,执行次数为次,所以时间复杂程度为O(
),称为平方阶。
(4)
for(i = 1 ; i <= n ; i++)
for(j = 1 ; j<= n ; j++)
{
c[i][j]=0;
for(k = 1; k<= n; k++)
c[i][j]+=a[i][k] * b[k][j];
}
解:++x是基本语句,执行次数为次,所以时间复杂程度为O(
),称为立方阶。
(5)
for(i=0;i<=n;++i){
for(j=1;j<=i-1;++j){
++x;
}
}
解: ++x是基本语句,执行次数为:(n(n-1))/2,所以时间复杂度为O()。
(6)
for(i=1;i<=n;i=2*i){
++x;
}
解答:++x是基础语句,设其执行次数为T(n),时间复杂