线性时间解决最大子数组问题
2013-10-07 02:57
295 查看
最大子数组问题又叫 maximum-subarray problem,算法导论第三版4.1节有关于其O(nlgn)运行时间的分治法描述,在4.1-5习题中要求给出线性时间的求解方法,
suppose 数组是 a1,a2,...an
naive freshman 可能会给出3n的时间复杂度,假设我已经考虑了a1,a2...ai的maximun-subarray(i),我现在需要考虑a[i+1]了,那么我显然需要比较(a1+a2+...+ai+a[i+1])与a[i+1]以及maximun-subarray(i),可是如果(a1+a2+...+ai)<0的话,就可以直接丢弃了,直接考虑a[i+1];而如果(a1+a2...+ai)>0的话,就根本不用考虑a[i+1],因为(a1+a2+...+ai+a[i+1])必然比a[i+1]大,于是时间复杂度可以降为2n
这里我给出python的代码:
值得一提的是这个线性时间算法在1985年就被CMU的大神Jon Bentley在他的神作《编程珠玑》中提出了,虽然我没读过但貌似是在第八章
但是,他比我们先想出,只不过他比我们早点出生而已
suppose 数组是 a1,a2,...an
naive freshman 可能会给出3n的时间复杂度,假设我已经考虑了a1,a2...ai的maximun-subarray(i),我现在需要考虑a[i+1]了,那么我显然需要比较(a1+a2+...+ai+a[i+1])与a[i+1]以及maximun-subarray(i),可是如果(a1+a2+...+ai)<0的话,就可以直接丢弃了,直接考虑a[i+1];而如果(a1+a2...+ai)>0的话,就根本不用考虑a[i+1],因为(a1+a2+...+ai+a[i+1])必然比a[i+1]大,于是时间复杂度可以降为2n
这里我给出python的代码:
def main(): A = [5,-1,3,-9,10,1] max = max_subarray(A) print max def max_subarray(A): max_ending_here = max_so_far = 0 for x in A: max_ending_here = max(0, max_ending_here + int(x)) max_so_far = max(max_so_far, max_ending_here) return max_so_far if __name__ == "__main__" : main()
值得一提的是这个线性时间算法在1985年就被CMU的大神Jon Bentley在他的神作《编程珠玑》中提出了,虽然我没读过但貌似是在第八章
但是,他比我们先想出,只不过他比我们早点出生而已
相关文章推荐
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 最大子数组问题---线性时间算法(转)
- 最大子数组问题的递归和非递归(线性时间)代码
- 线性时间算法解决最大间隙问题
- 关于php页面最大执行时间问题(set_time_limit函数在windows下不起作用的解决)
- 分治法解决寻找数组中最大最小值的问题
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- C++解决最大子列和问题,算法时间复杂度优化
- 分治策略__解决最大连续子数组的问题
- 算法导论-----最大子数组问题(线性解法)
- 最大间隙问题 线性时间算法
- 最大子数组之和(线性时间复杂度,C语言实现)
- 最大子数组问题的线性解法-wikipedia
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 分治策略解决最大子数组问题
- 线性时间内求最大子数组和
- 鸽舍原理 线性时间计算最大间隙问题
- 经典算法(3)——最大间隙问题(线性时间算法)
- c#数据结构之最大子数组问题(暴力解决法)