扫描算法求解连续子向量的最大和问题(Python)
2012-06-06 00:00
387 查看
上篇用有限状态机来求解,其实也是进行了一遍扫描,只是我把问题考虑的复杂了。
对于扫描,我觉得首先要问自己3个问题:
1. 如何扫描 (这里是遍历数组元素)
2. 每次扫描会改变什么 (这里的算法会改变maxendinghere,前一篇的算法是改变状态)
3. 改变的东西会对结果有影响么 (maxendinghere如果大于maxsofar,那么maxsofar就被赋值为maxendinghere)
不同的考虑问题的方式引入不同的解决方案,其中的差距太大了!!前一篇我太关注正负号了,导致我采用了序列分段,状态转移的方式去解决问题;这里的解法关注最大和,以及有可能影响最大和的因素,maxsofar和maxendinghere的相对大小。虽然时间复杂度都是O(n),但是,高下立现!
代码如下(python):
运行结果:
root@localhost :/home/James/mypro/Python# ./scan.py
[-1, -1, -1, -1]
0 0 0
[1, -1, -1, -1]
1 0 1
[-1, -1, -1, 1]
1 3 4
[-1, 2, 3, -4]
5 1 3
[1, 2, 3, 4]
10 0 4
[31, -41, 59, 26, -53, 58, 97, -93, -23, 84]
187 2 7
root@localhost :/home/James/mypro/Python#
后记:感觉python真的很适合写这种小demo,又快又方便。
对于扫描,我觉得首先要问自己3个问题:
1. 如何扫描 (这里是遍历数组元素)
2. 每次扫描会改变什么 (这里的算法会改变maxendinghere,前一篇的算法是改变状态)
3. 改变的东西会对结果有影响么 (maxendinghere如果大于maxsofar,那么maxsofar就被赋值为maxendinghere)
不同的考虑问题的方式引入不同的解决方案,其中的差距太大了!!前一篇我太关注正负号了,导致我采用了序列分段,状态转移的方式去解决问题;这里的解法关注最大和,以及有可能影响最大和的因素,maxsofar和maxendinghere的相对大小。虽然时间复杂度都是O(n),但是,高下立现!
代码如下(python):
#!/usr/bin/python def scan(vector): # return (maxsofar, low, high) length = len(vector) maxsofar = 0 maxendinghere = 0 low = 0 high = 0 low2 = 0 high2 = 0 for i in range(0, length): if maxendinghere + vector[i] > 0: maxendinghere = maxendinghere + vector[i] high2 = i+1 else: maxendinghere = 0 low2 = i+1 if maxsofar >= maxendinghere: high = high low = low maxsofar = maxsofar else: high = high2 low = low2 maxsofar = maxendinghere return (maxsofar, low, high) def test(): vector = [-1, -1, -1, -1] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print vector = [1, -1, -1, -1] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print vector = [-1, -1, -1, 1] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print vector = [-1, 2, 3, -4] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print vector = [1, 2, 3, 4] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print vector = [31, -41, 59, 26, -53, 58, 97, -93, -23, 84] (maxsofar, low, high) = scan(vector) print vector print maxsofar, low, high print def main(): test() if __name__ == '__main__': main()
运行结果:
root@localhost :/home/James/mypro/Python# ./scan.py
[-1, -1, -1, -1]
0 0 0
[1, -1, -1, -1]
1 0 1
[-1, -1, -1, 1]
1 3 4
[-1, 2, 3, -4]
5 1 3
[1, 2, 3, 4]
10 0 4
[31, -41, 59, 26, -53, 58, 97, -93, -23, 84]
187 2 7
root@localhost :/home/James/mypro/Python#
后记:感觉python真的很适合写这种小demo,又快又方便。
相关文章推荐
- 连续子向量的最大和问题(Python实现)
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 连续子向量最大和问题——《编程珠玑》读书笔记
- HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数
- HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数
- POJ 1050 二维最大连续子向量问题
- 类动态规划求解较小规模的最大团问题(Python实现)
- 求解最大连续子数组问题
- 求连续向量的最大子和问题(扫描算法)
- 最大连续子向量(分治策略和扫描算法)
- HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数
- HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?
- 扫描算法求一个向量的元素和最大的连续子向量
- 求最大和连续子向量问题的算法分析
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
- 动态规划求解连续子数组最大和问题(应该是新的描述方法?)
- Python实现求解最大子数组问题
- 分治策略求解最大子数组问题
- python使用分治法实现求解最大值的方法
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)