算法总结(一) 算法分析

来源:互联网 发布:中国f1车队知乎 编辑:程序博客网 时间:2024/05/16 17:53

算法分析

算法 数据结构 算法分析 算法复杂度


  • 什么是算法
  • 算法复杂度表示方法
  • 例题分析

什么是算法

算法(algorithm)就是解决一个问题需要遵循的,被清楚的指定的简单指令的集合。简而言之就是解决一个问题的方法。解决问题的方法有很多种,如何最好最快的解决问题就是算法的美妙之处。我更喜欢把算法当做一种艺术,一种智慧之美

算法复杂度表示方法

四个定义:
1.如果存在正整数 cn0 使得当 Nn0T(N)cf(N) ,则记为T(N)=O(f(N))

2.如果存在正整数 cn0 使得当 Nn0T(N)cg(N) ,则记为T(N)=Ω(g(N))

3.T(N)=θ(h(N)) 当且仅当 T(N)=O(f(N))T(N)=Ω(g(N))

4.如果 T(N)=O(p(N))T(N)θ(p(N)),则T(N)=o(p(N))

分析一下下面的例子

TA(N)=1000N

TB(N)=N2

TATB

程序运行时间分析

这里写图片描述

得到:

If N<1000TA(N)>TB(N)

If N>1000TB(N)>TA(N)

所以我们要根据不同的实际情况应用相应的算法去解决问题

这里写图片描述

从上也可以看出在数据大的时候算法优化的必要性

算法复杂度例题分析

最大区间和算法分析

题目要求:

在一串数中找到最大的区间和

这里写图片描述

算法一:

for each i (0 to N-1)for each j (i to N-1)    compute the sum of subsequence for (i to j)    check if it is maximum
        int MaxSubsequenceSum( const int A[ ], int N )        {            int ThisSum, MaxSum, i, j, k;/* 1*/      MaxSum = 0;/* 2*/      for( i = 0; i < N; i++ )/* 3*/          for( j = i; j < N; j++ )                {/* 4*/              ThisSum = 0;/* 5*/              for( k = i; k <= j; k++ )/* 6*/                  ThisSum += A[ k ];/* 7*/              if( ThisSum > MaxSum )/* 8*/                  MaxSum = ThisSum;                }/* 9*/      return MaxSum;

T(N)=O(N3)

算法二:

这里写图片描述

通过已经计算过的区间和求出下一个区间和

        int MaxSubsequenceSum( const int A[ ], int N )        {            int ThisSum, MaxSum, i, j;/* 1*/      MaxSum = 0;/* 2*/      for( i = 0; i < N; i++ )            {/* 3*/          ThisSum = 0;/* 4*/          for( j = i; j < N; j++ )                {/* 5*/              ThisSum += A[ j ];/* 6*/              if( ThisSum > MaxSum )/* 7*/                  MaxSum = ThisSum;                }            }/* 8*/      return MaxSum;        }

T(N)=O(N2)

算法三:

这里写图片描述

通过二分法

 static int        Max3( int A, int B, int C )        {            return A > B ? A > C ? A : C : B > C ? B : C;        }        static int        MaxSubSum( const int A[ ], int Left, int Right )        {            int MaxLeftSum, MaxRightSum;            int MaxLeftBorderSum, MaxRightBorderSum;            int LeftBorderSum, RightBorderSum;            int Center, i;/* 1*/      if( Left == Right )  /* Base case *//* 2*/          if( A[ Left ] > 0 )/* 3*/              return A[ Left ];                else/* 4*/              return 0;/* 5*/      Center = ( Left + Right ) / 2;/* 6*/      MaxLeftSum = MaxSubSum( A, Left, Center );/* 7*/      MaxRightSum = MaxSubSum( A, Center + 1, Right );/* 8*/      MaxLeftBorderSum = 0; LeftBorderSum = 0;/* 9*/      for( i = Center; i >= Left; i-- )            {/*10*/          LeftBorderSum += A[ i ];/*11*/          if( LeftBorderSum > MaxLeftBorderSum )/*12*/              MaxLeftBorderSum = LeftBorderSum;            }/*13*/      MaxRightBorderSum = 0; RightBorderSum = 0;/*14*/      for( i = Center + 1; i <= Right; i++ )            {/*15*/          RightBorderSum += A[ i ];/*16*/          if( RightBorderSum > MaxRightBorderSum )/*17*/              MaxRightBorderSum = RightBorderSum;            }/*18*/      return Max3( MaxLeftSum, MaxRightSum,/*19*/                          MaxLeftBorderSum + MaxRightBorderSum );        }        int        MaxSubsequenceSum( const int A[ ], int N )        {            return MaxSubSum( A, 0, N - 1 );        }

O(NlogN)

1 0
原创粉丝点击