计算机解决问题的步骤:
1. 数据(data):能够输入到计算机中,并且能被计算机处理的符号的集合。
2. 数据元素(data element):数据的基本单位,它在计算机处理和程序设计中通常被作为一个整体进行考虑和处理。
3. 数据项(data item):是数据不可分割的最小单位。一个数据元素可以由若干个数据项组成。
4. 数据对象(data object):是具有相同特征的数据元素的集合,是数据的一个子集。
5. 数据结构(data structure):是相互之间存在的一种或多种特定关系的数据元素的集合。元素之间的关系称为结构,形式定义为一个二元组。即:
Data_Structure=(D,S)
其中:D是数据元素的有限集,S是D上关系的有限集。
1. 数据的逻辑结构:指数据结构中数据元素之间的逻辑关系。数据逻辑的基本结构有四种:
(1)集合:结构中的数据元素之间除了“同属于一个集合”以外,无其他关系。
(2)线性结构:结构中的数据元素之间存在一对一的关系。
(3)树形结构:结构中的数据元素之间存在一对多的关系。
(4)图状结构(网状结构):结构中的数据元素之间存在多对多的关系。
四类基本结构的图示:(它们的复杂度依次递增)
数据的存储结构(physical structure):是数据的逻辑结构在计算机内存中的存储方式。又称为物理结构。
(1)顺序存储结构:是利用数据元素在存储器中的相对位置来表示元素间的逻辑顺序。
(2)链式存储结构:是利用结点中的指针来表示数据元素之间的关系。(它通常借助程序设计语言的指针来实现)
特点:借助指示元素的存储地址的指针表示数据元素之间的逻辑关系。
数据类型:是在一种程序设计语言中,变量所具有的数据种类,它限定了变量的取值范围和可做的操作。
抽象数据类型(abstract data type,ADT):是指一个数学模型以及定义在该模型上的一组操作。
我们不需要了解它的实现方法和细节,只关心它的逻辑特征。
特点:使用和实现相分离,实行封装和隐藏。在抽象数据类型设计时,把类型的定义与其实现分离开来。
抽象数据类型的三要素:元素、关系、操作。抽象数据类型可以用三元组表示为:
(D,R,P)
其中:D是数据对象,R是D上的关系集,P是对D的基本操作集。
算法(algorithm):是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条命令表示一个或多个操作。
算法的重要特性:
1. 有穷性:一个算法必须总是在执行有穷步骤后结束,且每一步都必须在有穷的时间内完成。
2. 可行性:一个算法中所描述的操作,必须可以通过已经实现的基本运算的有限次执行来完成。
3. 确定性:算法中的每一条指令必须没有二义性,对于相同的输入必须有相同的结果。
4. 一个算法有零个或多个输入:这些输入取自某个特定的对象的集合。
5. 一个算法有一个或多个输出:他们是和输入有着某些特定关系的量,通常是对输入进行加工得到的结果。
前三条是算法的基本特性。
一个好的算法应满足以下要求:
1. 正确性:通常包含以下几个层次:
①程序中不含语法错误。
②程序对于机组给定的输入数据都能得出满足要求的结果
③程序对于精心选择的、典型的、苛刻的且带有刁难型的几
组输入都能得出满足要求的结果。
④程序对一切合法输入都能得出满足要求的结果。
2. 可读性:算法应该易于理解,晦涩难懂难以调试。
3. 健壮性:当输入的数据非法时,应该返回一个表示错误或错误性质的值。
4. 高效性:算法应该具有时间执行时间和算法执行过程中的最大存储空间两方面的效率,时间复杂度和空间复 杂度是两者不可兼得的。
算法分析主要是指分析算法的效率。
1.算法的时间复杂度
(1)事后统计方法:主要是在算法的关键部位插入计时器,当算法执行时打开计时器,终止时关闭,得出算法执行时间的差值,从而衡量算法的效率。但是具有较大的缺陷。
(2)事前分析估算法:
①算法所采取的规模
②问题的规模
③程序设计语言
④编译的代码质量
⑤机器执行指令的速度
为了避开软硬件环境因素的影响,假定一个算法的运行时间只是问题规模的函数,那么在问题规模一定的情况下,算法采取的策略将直接决定算法的效率。凡是关于时间复杂度的求法均只与问题的规模有关。
一个算法由控制结构和原操作组成。
将原操作重复执行的次数与问题规模n之间的关系记为函数:f(n)。
当讨论一个程序的运行时间时,我们注重的是时间的增长率。随着问题规模的增大,它的增长率与f(n)的增长率相近,所以它们在数量级上是一致的。因此当问题规模n趋于∞时,把f(n)的数量级(阶)成为算法的渐近时间复杂度,简称时间复杂度,记为T(n)。
T(n)=O(f(n))
它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
时间复杂度的计算方法:
假定每条语句的执行时间为单位时间,算法的时间复杂度是该算法中所有员操作语句的执行频度之和。
例1-5 赋值语句
temp=1;
i=j;
j=temp;
算法执行时间是一个与问题规模n无关的常数,则算法的时间复杂度为常数阶,即:T(n)=O(1)。
例1-6 简单循环
y=0;
for(k=1;k<=n;k++) //嵌套层数为0
x++;
for(i=1;i<=n;i++) //嵌套层数为1
for(j=1;j<=n;j++)
y++; //以这条语句的频度为基准,嵌套
时间复杂度T(n)=O(n2),当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最里层语句的频度决定的。
例1-7 选择分支结构
if(x>n)
x++;
else
for(j=1;j<=n
时间复杂度T(n)=O(n)
如果是选择分支结构,时间复杂度决定于各分支中最耗时的部分。
例1-8 在数组A[n]中查找值为k的元素,若找到,则返回其位置i(0<=i
i=n-1;
while((i>=0)&&(A[i]!=k))
i--;
return i;
该问题不仅与规模n有关,而且与值为k的元素在数组A中位置有关。所以要分情况:最好情况下(一开始就找到了)时间复杂度为T(n)=O(1);最坏情况下(最后一次才找到目标元素)时间复杂度为T(n)=O(n)。(复杂程度依次递增)
2. 空间复杂度
定义:该算法所耗费的存储空间,它也是问题规模的函数,记作S(n)=O(f(n))。渐进空间复杂度也就是空间复杂度。
一个算法在计算机上所占用的存储空间取决于三点:
(1) 存储算法本身所占用的存储空间
(2) 算法的输入/输出数据所占用的存储空间
(3) 算法在运行过程中临时占用的存储空间
弄清数据结构的基本术语,弄清二元组中变量含义,区别数据的逻辑结构以及存储结构的概念,弄清抽象数据类型(ADT)和三元组中变量含义,弄清算法的定义、特性以及算法的设计要求,重点掌握算法的时间复杂度分析方法。