算法总结(一) 算法分析

算法分析

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


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

什么是算法

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

算法复杂度表示方法

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

2.如果存在正整数 c n0 使得当 Nn0 T(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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值