Chinaunix首页 | 论坛 | 博客
  • 博客访问: 76127
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 67
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-23 11:45
文章分类

全部博文(17)

文章存档

2015年(17)

我的朋友

分类: LINUX

2015-04-16 09:39:28

        第一章 绪论
        1 大O记号:
       
        1.1 大O记号
              大O记号是时间复杂度的一种刻度,起始是一种趋势的表示。而时间复杂度描述的则是程序执行的次数,等价运行时间。
              关于时间复杂度:
              T(n) = O( f(n) ),f(n)是一个函数,T(n)就表示时间复杂度;
       
        1.2 刻度--高效解
            1.2.1 常数O(c)
                例如程序运行的次数是一个常数,则对于大O记号来书,有如下等式:
                2=2013=2013*2013=O(1)甚至是20132013=O(1);
                怎么理解这个O(1)呢?假设现在有一个坐标轴,横轴表示时间,纵轴表示运算成本(次数)。那对于运算成本(次数)为常数的程序说随
        着时间的不断增加,其运算成本是不会改变的。不过这是一种理想状态。
                而什么样的代码段对应于这样一个刻度呢?有以下三个条件:
                a)一定不含循环;
                b)一定不含分之转向;
                c)一定不含调用和递归;
            1.2.2 对数O(logn)
                a)常底数无所谓
                对于任意的常数a,b,都有:logan=logab*logbn=O(logbn);
                b)常数次幂无所谓
                对于任意的c>0,都有:(logn)c=c(logn)=O(logn) ;
                c)对于多项式
                123*log321n+log105(n2-n+1)=O(log321n);
                之前讲过,大O记号表示一种趋势,如果是O(logn),再想想之前讲得坐标轴。随着时间的增加,计算成本趋近与一个平稳的值;

        1.3 刻度--有效解
              有效解就是O(nk),表示一个多项式。
              如果代码段的计算成本为f(n) = aknk+......+a0,那该代码段的时间复杂度可以被标记为O(nk),取最高次项。同理,可以想象一下那个
             坐标轴,想想nk的函数曲线。想象一下大概的趋势。
    
        1.4 刻度--难解
              难解指的是f(n) = an,其中a为常数,这类计算成本是不能被接受的。
         
              综上所述,应有如下等式:
              对于任意的c>1,有nc=O(2n)   
                                    n1000=O(1.00000001n)=O(2n)     //即多项式的成本永远都低于指数的成本,指数构成了一个上界
              截图一张,能够清晰的看出各个刻度对应代码段运算成本的关系:
        

        2 迭代和递归------这里就不多作叙述了,如果不了解的朋友可以看看:
            http://blog.csdn.net/swliao/article/details/5337896
          
        3 动态规划
                  动态规划的含义就是:利用递归的方法按要求实现代码,因为对于递归来说一般都是可以实现的,以运算成本为代价,然后找
           出原理,然后用迭代的方法实现。例子有一个LCS最长公共子序列。             
           递归的源代码:
           

点击(此处)折叠或打开

  1. /*
  2.  *lcs_recursion.c
  3.  *description:realize the lcs by recursion
  4.  *By HG
  5.  *2015-4-8
  6.  */
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<string.h>
  10. int lcs(char str_a[],int a_length,char str_b[],int b_length)
  11. {
  12.     
  13.     if(a_length == -1 || b_length == -1)
  14.     {
  15.         return 0;
  16.     }
  17.     if(str_a[a_length]==str_b[b_length])
  18.     {
  19.         
  20.         return lcs(str_a,--a_length,str_b,--b_length) + 1;
  21.     }
  22.     else
  23.     {
  24.         return lcs(str_a,--a_length,str_b,b_length)>lcs(str_a,a_length,str_b,--b_length)?lcs(str_a,--a_length,str_b,b_length):lcs(str_a,a_length,str_b,--b_length);
  25.     }
  26. }

  27. int main(void)
  28. {
  29.     char a[]="tsinghua";
  30.     char b[]="sina";
  31.     int lcs_length;
  32.         
  33.     lcs_length = lcs(a,strlen(a)-1,b,strlen(b)-1);
  34.     
  35.     printf("the LCS of a and b is %d\n",lcs_length);

  36.     return 0;
  37. }
           迭代的源代码:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<string.h>

  3. #define ARRAY_LEN 20

  4. int max(int a,int b)
  5. {
  6.         return a>b ? a:b;
  7. }

  8. int main()
  9. {
  10.         int array[ARRAY_LEN][ARRAY_LEN]={0};
  11.         int a_len,b_len;
  12.         int i,j;
  13.         char *str_a="tsinghua";
  14.         char *str_b="sina";

  15.         a_len = strlen(str_a);
  16.         b_len = strlen(str_b);


  17.         for(i=0;i<a_len;i++)
  18.         {
  19.                 for(j=0;j<b_len;j++)
  20.                 {
  21.                         if(str_a[i]==str_b[j])
  22.                                 array[i+1][j+1]=array[i][j]+1;
  23.                         else
  24.                                 array[i+1][j+1]=max(array[i+1][j],array[i][j+1]);
  25.                 }
  26.         }

  27.         for(i=0;i<a_len+1;i++)
  28.         {
  29.                 for(j=0;j<b_len+1;j++)
  30.                 {
  31.                         printf("%d\t",array[i][j]);
  32.                 }
  33.                 printf("\n");
  34.         }

  35.         return 0;
  36. }


        

            

阅读(1257) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:linux下如何使用sftp命令

给主人留下些什么吧!~~