数据结构概念
有结构的数据元素的集合(相互之间有某种特定关系的数据元素的集合)
(包括数据元素的集合,数据元素关系的集合)
数据结构主要研究内容
1. 各类数据结构的逻辑结构,物理结构以及它们之间的关系
2. 为每种数据结构定义了基本运算
3. 能利用数据结构和基本运算编制相应的算法
4. 分析算法效率(主要从时间角度)
基本术语
数据(Data):所有能被计算机处理的符号的集合。
数据元素(Data Element):数据这个集合中的一个个体。设给定数据集合D={d1,d2,…dn}则di属于D,并称di为数据元素。
数据对象(Data Object):具有相同性质的数据元素的集合。数据的一个子集。
数据项(Data Item):数据元素常常可以分为若干个数据项,数据项是数据具有意义的最小单位。
(万事万物=>数据=>数据结构)
数据结构(Data Structure):带有结构(联系)的数据元素的集合。即数据元素之间的运算及运算规则。
用集合形式描述,数据结构是一个二元组:DS=(D,R)(D:数据元素的集合 R:D上关系的集合)
逻辑结构(Logical Structure):数据元素之间的结构关系。
物理结构(Physical Structure):数据结构在计算机内的表示。
算法描述和算法分析
一、 算法(Algorithm)
1. 概念:算法是一个有限的指令集,遵循指令流可以完成特定的功能。
2. 算法的基本特性:
1) 有穷性:算法经过有限步后结束;(算法是程序指导,程序在计算机中可以无穷循环)
(a)算法是有穷指令集
(b)指令流程中若有循环,循环必须经过有限步骤后终止。
2) 确定性:下一步必须是明确的;(不能有二义性)
3) 可行性:每一步是可执行的;
3. 算法和程序的区别
算法:解决问题的一种方法或一个过程,考虑如何将输入转换成输出,一个问题可以有多种算法。
程序:用某种程序设计语言对算法的具体实现。
(算法和程序体现在软件生命周期的不同阶段)
软件生命周期:1.需求调研 2.概要设计(划分子系统,子系统划分模块) 3.详细设计(实现每一个模块的功能,编制算法实现:自然语言,程序框图) 4.编码实现
区别:
程序可以是无穷的,例如OS,算法的是有穷的;
程序可以是错误的,算法必须是正确的;
程序用程序设计语言描述,在机器上可以执行;算法还可以用框图、自然语言等描述。
二、 算法描述语言——类Pascal
所有算法均以过程(没有返回值,直接作为一条语句使用)或函数的形式表示;
PROC 过程名(参数表);
{算法说明}
语句组
ENDP;{过程名}
FUNC函数名(参数表):类型;
{函数说明}
语句组
RETURN(f)
ENDF;{函数名}
调用过程语句:过程名(参数表)
调用函数语句:变量名:=函数名(参数表)
算法语句
出错语句:ERROR(‘出错信息’);程序直接返回
注释语句:{注释内容}
语句结束符号:‘;’
语句组符号:[ ]
基本函数:max()、min()、abs()、eof文件、eoln行结束
布尔运算:AND(算出两边的值)、OR、NOT、CAND(若左边为零时直接给出结果0,提高效率)、COR
赋值语句:变量名:=表达式;
分支语句:IF 条件THEN 语句 ELSE 语句;
CASE
条件1:语句1;
.……
条件n:语句n;
(ELSE 语句n+1)
ENDC;
循环语句:
FOR 变量名:=初值TO终值DO循环体;(初值小于中值)
FOR 变量名:=初值DOWNTO终值DO循环体;(初值大于终值)
WHILE条件DO循环;(条件为真执行循环体直到条件为假)
REPEAT循环体UNTIL条件;(先执行循环体然后判断条件,直到条件为真)
标准输入输出过程:read(变量表);write(变量表)
三、 算法分析
衡量算法好坏的三个尺度:
运行所花费的时间(算法的时间特性);
所占用的存储空间的大小(算法的空间特性);
其他(可读性、易调性、健壮性等)。
算法的时间特性:
语句频度(Frequency Count):语句可能重复执行的最大次数。(着重考虑循环)
时间复杂度(Time Complexity):设算法中所有语句的语句频度为t(n),f(n)是当n趋向无穷大时与t(n)为同阶无穷大,则算法的时间复杂度T(n)=O(f(n))
其中:n为算法计数量或称为规模(size);
f(n)是运算时间随n增大时的增长率;
O(f(n))是算法时间特性的量度。
例:程序段 语句频度 时间复杂度
1 x:=x+1; 1 O(1)常数阶
2 FOR i:=1TO n DO x:=x+1; n+1 O(n)线性阶
3 FOR i:=1TO n DO n+1
FOR j:=1 TO n DO x=x+1 n(n+1) O(n2)平方阶
注:
(1)注意时间复杂度的规范化写法
(2)时间复杂度的n不带系数,需简化
(3)区分语句频度和时间复杂度,时间复杂度是针对整个算法而言的,不是针对某一个语句而言的。
算法与时间复杂性的关系
设:A1,A2和A3是求解同一问题的不同算法,其时间复杂度分别为:O(n)O(nlogn)O(N!)。C1和C2为计算机,且C2的计算速度是C1的10倍。
复杂度 C1可解规模 C2可解规模 可解规模的关系
O(n) N11 N21 N21=10N11
O(nlogn) N12 N22 N22=10N12
O(N!) N13 N23 N23=N13+小常数
(低效算法在低速和高速计算机上运行无大区别,高速计算机无法弥补低效算法)