算法定义:解决特定问题的求解步骤的描述,在计算机中表现为指令的有限序列,每条指令表示一个或多个操作。

算法的特性:

    输入输出:输入0或多,输出1或多

    有穷:执行有限的步骤,可以自动结束,可接受时间

    可行:每一步都能通过执行有限次数完成

    确定:只有一条执行路径,不会有二义性

算法的设计要求:

    正确:

    健壮:输入不合法不会产生异常和错误

    可读:

    时间空间效率高

算法效率度量方法

    事后统计:有缺陷,依赖于系统软硬件

    事前估计:抛开软硬件,主要依赖于算法设计和问题规模

算法的渐进增长:

    给定f(n)和g(n),如果存在整数N,当所有n>N,f(n)总是比g(n)大,则f(n)的渐     进增长快于g(n)

    忽略加法常数、忽略最高次项的项数、忽略所有非最高次项

算法的时间复杂度

    首先计算T(n),它是确切的执行次数。

    接着由T(n)推到O(f(n)),方法是用常数1代替所有常数项,只保留最高项,如果     最高项存在且不是1,去除最高项的项数

举例

 

  1. //常数阶  
  2. int sum = 0,n = 100; 
  3. sum = (n+1) * n /2;//只执行了一次,此时T(n)=1=O(f(1)) 
  4. printf("%d",sum);  
  5.  
  6. //线性阶  
  7. int i; 
  8. for(i=0;i<n;i++){ 
  9.     }//T(n)=n= O(f(n))  
  10.      
  11. //对数阶 
  12. int count = 1; 
  13. while(count<n){ 
  14.     count = count * 2; 
  15. }//问题就是这个循环执行多少次?假设执行x次,则有count=2的x次方,且count<n,所以有2的x次方<n 
  16.  //结果就是T(n)=log以2为底n=O(f(logn)) ,在这次计算中我们将n当做已知,解方程即可 
  17.   
  18. //平方阶 
  19. int i,j; 
  20. for(i=0;i<n;i++){ 
  21.     for(j=0;j<n;j++){//T(n)=O(f(n2次方)) 
  22.     } 
  23. }  
  24.  
  25. int i,j; 
  26. for(i=0;i<n;i++){ 
  27.     for(j=0;j<m;j++){//T(n)=O(f(n*m)) 
  28.     } 
  29. }  
  30.  
  31. int i,j; 
  32. for(i=0;i<n;i++){ 
  33.     for(j=i;j<n;j++){//当i=0,内循环n次,i=1时,内循环n-1次......n+(n-1)+(n-2).....+1+0=1/2(n平方)+1/2(n)=O(f(n平方)) 
  34.     } 
  35. }  
  36.  
  37. n++;//1 
  38. function(n);//n 
  39. int i,j; 
  40. for(i=0;i<n;i++){//n平方  
  41.     function(i); 
  42. for(i=0;i<n;i++){//(n(n+1))/2  
  43.     for(j=i;j<n;j++){ 
  44.     }//O(f(n平方)) 

复杂度排行