基本概念
-
数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。
-
数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的基本单位。
-
数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。
-
数据类型:在一种程序设计语言中,变量所具有的数据类型。整型、浮点型、字符型等。
-
数据结构:一个有穷的结点集合D,以及该集合中各结点之间的关系R,组成一个数据结构,表示成B=(D,R)。D和R是对客观事物的抽象描述,R表示结点之间的逻辑关系,(D,R)指的是数据的逻辑结构。
-
逻辑结构:数据之间的相互关系。
- 集合 结构中的数据元素除了同属于一种类型外,别无其他关系。
- 线性结构 用来表示结点之间某种先后次序关系,一个结点只有一个前驱和一个后继,但首结点没有前驱,尾结点没有后继。数据元素之间一对一关系。
- 树形结构 表示结点之间的层次关系、分支关系和嵌套关系,一个结点只有一个前驱(根结点没有前驱),但可以有多个后继。数据元素之间一对多关系
- 图状结构或网状结构 任何两个结点之间都可能有(或没有)关系,结构中的数据元素之间存在多对多的关系
-
物理结构/存储结构:数据结构在计算机内的存储形式(如:顺序结构、链式结构、索引结构、哈希结构)等。
-
抽象数据类型ADT:将“数据”连同对其的“处理操作”(即运算)封装在一起而形成的复合体。
-
算法的五个特性:有穷性、确定性、可行性、输入、输出
-
算法的表现形式:描述形式、程序形式。
-
算法设计要求:正确性、可读性、健壮性、高效率与低存储量需求。
-
算法的描述有伪程序、流程图、N-S结构图等。E-R图是实体联系模型,不是程序的描述方式。
-
算法分析:对算法的评价,也称为评估或评测。最重要的两点:算法的正确性、算法的有效性。
-
时间复杂性:算法对时间的需求称为算法的时间复杂性,或时间复杂度。时间复杂度由小到大:O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)。幂次时间复杂度有小到大O(2n)、O(n!)、O(nn)
-
空间复杂性:算法对空间的需求称为算法的空间复杂性,或空间复杂度。
-
最坏情况:对于具有相同输入数据量的不同输入数据,算法时间用量最大值。
-
平均情况:对于所有相同输入数据量的各种不同输入数据,算法耗用时间的平均值。
-
计算时间复杂性的方法:
-
支配性语句度量法 往往有一条语句的执行次数超过其他语句执行次数的总和,即这条语句在花费时间上起“支配性作用”,于是可选这条语句的执行次数作为度量这段程序花费时间的阶。
-
分段计算法 一个复杂的程序,往往可按结构(或功能)划分成相对独立的若干段,可以分别计算各段时间耗费,然后相加,作为整个算法的时间复杂性。
例:若其中一段时间耗费为O(f(n)),另一段时间耗费为O(g(m)),那么两端共耗费:
O ( f ( n 2 ) ) + O ( g ( m ) ) = O ( f ( n ) + g ( m ) ) O(f(n^2))+O(g(m))=O(f(n)+g(m)) O(f(n2))+O(g(m))=O(f(n)+g(m)) -
分层计算法 一段程序中出现多重循环,可以分别计算各层的时间耗费,然后相乘,其乘积作为该程序的时间复杂性。
例1:for(i=0;i<n;i++){ x=y=0; for(j=0;j<n/2;j++){ if(a[j]>a[i]) x+=1; if(a[j]<a[i]) y+=1; printf("%d,%d\n",x,y); } }
其外循环共执行n次,外循环每执行一次,内循环都执行n/2次,O(n/2)=O(n),即
O ( n ) ∗ O ( n ) = O ( n 2 ) O(n) * O(n) = O(n^2) O(n)∗O(n)=O(n2)
例2:for(i=1;i<=n;i++){ for(j=1;j<=i;j++){ printf("%d",i*j); } }
外循环第i次执行时,内循环执行i次,所以内循环总的执行次数为:
1 + 2 + … + n = ∑ i = 1 n i = n ( n + 1 ) 2 = n 2 2 + n 2 1+2+…+n=\sum_{i=1}^ni=\frac{n(n+1)}{2}=\frac{n^2}{2}+\frac{n}{2} 1+2+…+n=i=1∑ni=2n(n+1)=2n2+2
-