第一章
1. 1算法时间复杂度分析
算法中基本操作的执行次数作为时间复杂度的度量。这里说的时间复杂度是其中基本操作的总次数。
1.时间复杂度的计算
在算法中总能看到一个n,可称为问题的规模,则基本操作所执行的次数是n的一个函数f(n),对求出的f(n),取出其中随n增大而增长最快的项,将系数改成1,作为时间复杂度的度量。记为T(n)=O(f(n)中增长最快的项/此项的系数)。
例:f(n)=2n3+4n2+100, T(n)=O(2n3/2)=O(n3)。
一般的规律如下:
1.f(n)与n无关时,T(n)=O(1)。
2.f(n)与n是线性关系时,T(n)=O(n) 。
3.f(n)与n是二次方关系时,T(n)=O(n2)。
代码例题精讲:
例【1】:
void fun(int n)
{
int i=1,j=100;
while(i<n)
{
++j;
i+=2;
}
}
分析:1.确定规模:由循环条件i<n,说明执行次数与参数n有关,则n就是规模。
2.计算出函数f(n),i初始值是1,每次自增2,假设自增m次结束。则i=1+2m,因此有1+2m+K=n(K是常数)。
m=(n-1-K)/2,即f(n)=(n-1-K)/2。增长最快的项为n/2.则T(n)=O(n)。
例【2】
void fun(int n)
{
int i, j, x = 0;
for (i = 0; i < n; i++)
for (j = i + 1; j < n; ++j)
++x;
}
分析:++x位于内层循环中,因此作为基本操作。n为规模。则执行次数为f(n)=n(n-1)/2,变化最快的是n^2/2
所以T(n)=O(n^2)。
1.2 基本概念
1.数据结构:相互之间存在一种或多种特定关系的*数据元素* 的集合。包括:逻辑结构,存储结构和对数据的运算。
2.逻辑结构:数据之间关系的描述。与存储结构无关,一种逻辑结构可有多种存储结构。
共包含两类:
- 线性结构:一个数据元素的有序集合。基本特征:
1.必存在唯一的一个第一个元素。
2.必存在唯一的一个最后一个元素。
3.除最后一个元素外,其他元素均有唯一的后继。
4.除第一个元素外,其他元素均有唯一的前驱。 - 非线性结构:存在着一对多的关系,其中有树形结构和图形结构。
3.物理结构:又称存储结构,是数据的逻辑结构在计算机中的表示。包括数据元素的表示和关系的表示。
1.3 算法的基本知识
一.算法的特性:
- 有穷性:一个算法必须保证执行有限步骤之后结束。
- 确定性:算法的每一步骤必须有确定的定义。
- 可行性:算法中的所有操作都必须可以通过已经实现的基本操作进行运算,并在有限次内实现。
二 算法的设计目标:正确性,可读性,健壮性和算法效率4个方面。也称为评价算法质量的主要方面。