算法基础知识-期末

算法定义
*算法是解决某一特定问题的一组有穷指令的序列。
*算法是完成一个任务所需要的具体步骤和方法。也就是说给定初始状态或输入数据,经过有限次运算,能够得出所要求 或期望的终止状态或输出数据。

算法的五个重要特性
确定性、可行性、输入、输出、有限性
*确定性:算法的每种运算必须要有确切的定义,不能有二义性。

例:不符合确定性的运算
5/0
将6或7与x相加
未赋值变量参与运算

*可行性:算法中有待实现的运算都是基本的运算,原理上每种运算都能由人用纸和笔在有限的时间内完成。

例:整数的算术运算是“能行”的
实数的算术运算是“不能行”的

*输入:每个算法有0个或多个输入。这些输入是在算法开始之前给出的量,取自于特定的对象集合。
*输出:一个算法产生一个或多个输出,这些输出是同输入有某种特定关系的量。
*有限性:一个算法总是在执行了有穷步的运算之后终止。

计算过程:只满足确定性、能行性、输入、输出四个特性但不一定能终止的一组规则。

算法设计的例子—穷举法

穷举法:是从有限集合中,逐一列举集合
的所有元素,对每一个元素逐一判断和处
理,找出问题的解。

算法复杂性分析

算法复杂性:算法运行所需要的计算机资源的量
时间复杂性:需要时间资源的量
空间复杂性:需要空间资源的量

运行时间T(n)的估算

void  childen_question(int n,int &k,int g[],int m[],
        int s[])
{
      int  a,b,c;     
      k=0;                                  //1
      for(a=0; a<=n; a++)          //1+2(n+1) 
          for(b=0; b<=n; b++)      // n+1+2 (n+1)2
              for(c=0; c<=n; c++) // (n+1)2 +2(n+1)3
                 if(!(c%3)&&a+b+c==n && 
       //14(n+1)3                    5*a+3*b+c/3==n) 
                 {
                       g[k]=a;  m[k]=b;  s[k]=c;
                       k++;               //4(n+1)3       
                 }
}  

T1(n) ≤1+ 1+2(n+1) + n+1+2 (n+1)2+
(n+1)2 +2(n+1)3+14(n+1)3+4(n+1)3
= 20n3 +64n2 +72n +31

时间复杂性的表示方法

常见的时间复杂度

O(1) :几乎不存在
O(logn):不能考虑全部输入
O(n):遍历、扫描全部输入
O(nlogn):许多分治算法
O(n2 ):两层循环
O(n3) :三层循环
O(2n ) :一个集合的所有子集
O(n!) :一个集合中的元素的所有组合

多项式时间算法

可用多项式来对运行时间限界的算法
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)

指数时间算法

运行时间用指数函数限界的算法
O(2n)<O(n!)<O(nn)

时间复杂度分析的步骤

1)确定用来表示问题规模的变量;
2)确定算法的基本操作;
3)写出基本操作执行次数的函数(运行时间函数);
4)如果函数依赖输入实例,则分情况考虑:最坏情况、最好情况、平均情况;
5)只考虑问题的规模充分大时函数的增长率,用渐近符号O 、Θ、Ω 、o来表示。
6)常用O和Θ

一般:
检索和排序问题,可选元素比较操作作为基本操作
矩阵乘法问题,可选数乘作为基本操作
遍历链表问题,可选设置或更新链表指针作为基本操作
图的遍历问题,可选访问图中的顶点的操作作为基本操作

例:分析以下程序段的时间复杂度

for(k=1; k<n ; k++)
             y = y+1;     O(n)
② for(k=1; k<n ; k++)
     {
     y = y+1;
     for(j=0; j<=(2*n); j++)
          x++;                  O(n2)
      }
③ for(k=0; k<n ; k++)
        for( m=0; m<= k; m++) 
            A[k][m] = m+k;       O(n2)
④ for(k=0; k<n; k++)
       for( m=0; m<n; m++)
       {
             C[k][m] = 0;
             for(j=0; j<n; j++)
                 C[k][m] += A[k][j]*B[j][m];      O(n3)
       }

最好情况、最坏情况、平均情况分析

有些算法的运行时间除与问题规模有关外,还与输
入元素的初始排列顺序有关。因此,有3种分析方法:
最好情况:依据输入元素顺序,算法所达到的最短运
行时间。
最坏情况:依据输入元素顺序,算法所达到的最长运
行时间。
平均情况:算法的运行时间取算法所有可能输入的平
均运行时间。

练习

练习:分析下列算法的最好情况、最坏情况、
平均情况的时间复杂性.
输入:数组A[],元素个数n
输出:按递增顺序排列的数组A[]


void insert_sort(int A[], int n)
{
    int    a,i,j;
         for(i=1; i<n; i++) { 
                 a = A[i];       
                 j = i-1;
                 while(j>=0 && A[j]>a) {/* 非递增*/
                      A[j+1] = A[j];
                      j--;
                 } 
                 A[j+1] = a;   }
}   

分析:
最好情况:元素按升序排列,此时while不执行,故时间复杂性为o(n)
最坏情况:元素按降序排列,此时,while每次执行最大次数,故时间复杂性为o(n2)

算法的空间复杂性分析

算法的空间复杂性,指的是为解一个问题实例而需
要的存储空间。有两种分析方法:
1.算法所需的工作空间
不包含存储输入数据、程序代码和常数的空间,
仅包含算法函数体内新生成的变量空间。
2.程序所需的运行空间
包含存储输入数据、程序代码和常数的空间,以及含算法函数体内新生成的变量空间。

猜你喜欢

转载自blog.csdn.net/q1694222672/article/details/80725269
今日推荐