今天一下午在看sharepoint了,又有活干,所以时间比较紧凑,于是想起了前些日子写的求最大子序列之和,作为每日一小题吧,暂做自我安慰吧。
求最大子序列之和,主要要注意他的效率,
1,算法复杂度是O( pow( n, 2 ) )
2,算法复杂度为o(n)
3,还从网上看了一种 递归的“分而治之”( divide-and-conquer )的方法。(现在转一下)
比如 4 -3 5 -2 -1 2 6 -2
First Second
把序列分为两部分,那么最长子序列要么在First,要么在Second,要么就既在First又在Second。
第一中情况只要求First的最大子序列(递归调用),第二中情况只要求Second的最大子序列(还是递归调用)。对于第三种情况,只要找到包含First最后一个元素(在例子中是2)在First的最大子序列(例子中是 4,-3,5,-2)和包含Second起始元素(-1)在Second的最大子序列(-1,2,6)然后相加就行了。
这种算法的复杂度计算和计算斐波那契数列的复杂度相似,设 N 个数的执行次数是 T( N ) ,那么 T( N ) = 2*T( N/2 ) + O( N ) 其中T( 1 ) = 1
O( N ) 可以看成 N ,那么可以观察得到 T( N ) = N * logN