回 帖 发 新 帖 刷新版面

主题:数据结构与算法分析—C语言描述(Mark Alen Weiss)中的一个问题


这是求最大子序列的一个递归实现,使用分治算法。比如 
4 -3 5 -2 -1 2 6 -2 的最大子序列的和为11。(书中第20页)
书上说第9到17行之间花费的时间为O(N)。但我觉得好像是O(N^2)。想不出为什么会是O(N)。
请高手指点一下。




 static int
        Max3( int A, int B, int C )
        {
            return A > B ? A > C ? A : C : B > C ? B : C;
        }

/* START: fig2_7.txt */
        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 )



Aug 12 15:27 1996  max_sum.c Page 3


        {
            return MaxSubSum( A, 0, N - 1 );
        }
/* END */

回复列表 (共4个回复)

沙发

这是分治啊 
怎么会是O(n^2)啊
理解了算法思想就明白了。

板凳


是啊,分治一般都是O(NlogN)吧。但追踪一下函数的执行过程,又觉得好像是O(N^2)。
能告诉我怎样深入函数的内部去分析吗?首先我承认它是O(NlogN),因为我在自己的电脑上做过了验证。只是当一步步追踪函数的执行过程时,又觉得是O(N^2),都快把我搞晕了。高手帮解说解说吧!!!![em18]

3 楼

呵呵 楼主仔细看 Weiss是说第9到17行的复杂度是 O( N ),不是说整个算法。
而第9到第17行是两个遍历.......所以......

关于整个算法的复杂度请看第18页最下行。

4 楼


现在想明白了,原来只是不理解而已。算法真是博大精深啊!!!
N+N/2+N/4+……+N/2^(N-1)=N/(1-1/2)=2N=O(N)

我来回复

您尚未登录,请登录后再回复。点此登录或注册