网易云课堂《数据结构》最大子列和问题的python实现(地址:http://mooc.study.163.com/learn/1000033001?tid=2001462004#/learn/content?type=detail&id=2001778303)
首先声明create_sequence(num)函数来创建一个长度为num的list。
1.def create_sequence(num): 2. i = 0 3. sequence = [] 4. while i < num: 5. sequence.append(random.randrange(-20,20)) 6. i += 1 7. return sequence,num
算法1:粗暴的比较所有子列的和来找到最大值,算法复杂度O(n3)
1.#算法1遍历所有子列后记录最大子列 2.def algorithm1(sequence,num): 3. start_time = time.clock() 4. thisSum = 0 #记录当前子列和 5. maxSum = 0 #记录最大子列和 6. i = 0 7. j = 0 8. k = 0 9. while i < num: 10. j = i 11. while j < num: 12. thisSum = 0 13. k = i 14. while k <= j: 15. thisSum += sequence[k] 16. k += 1 17. if thisSum > maxSum: 18. maxSum = thisSum 19. j += 1 20. i += 1 21. end_time = time.clock() 22. return maxSum,end_time-start_time
算法2:针对算法1进行的改进,将三重循环减至二重循环,算法复杂度0(n2)
1.def algorithm2(sequence,num): 2. start_time = time.clock() 3. thisSum = 0 4. maxSum = 0 5. i = 0 6. j = 0 7. while i < num : 8. thisSum = 0 9. j = i 10. while j < num: #对于相同的i,不同的j,只要在j-1次循环的基础上累加一项即可,这样可以减少一轮迭代,降低时间复杂度 11. thisSum += sequence[j] 12. if thisSum > maxSum: 13. maxSum = thisSum 14. j += 1 15. i += 1 16. end_time = time.clock() 17. return maxSum,end_time-start_time
算法3:在线处理,算法复杂度O(N)
1.def algorithm4(sequence,num): 2. start_time = time.clock() 3. thisSum = 0 4. maxSum = 0 5. i = 0 6. while i < num: 7. thisSum += sequence[i] #向右累加 8. if thisSum > maxSum: 9. maxSum = thisSum #发现更大和则更新当前的结果 10. elif thisSum < 0: #如果当前子列和为负,则不可能使后面的部分和增大,就可以抛弃 11. thisSum = 0 12. i += 1 13. if maxSum == 0: #考虑list中各项都不是正数的情况 14. tempSequence = sequence.sort(reverse=True) 15. if 0 in sequence: #如果存在0,则最大值为0 16. return 0 17. else: #否则子列的最大值就为最大的负值 18. return sequence[0] 19. end_time = time.clock() 20. return maxSum,end_time-start_time
测试代码和运行结果:
1.if __name__ == '__main__': 2. sequence,num = create_sequence(10) 3. result,time_1_1 = algorithm1(sequence,num) 4. result,time_2_1 = algorithm2(sequence,num) 5. result,time_3_1 = algorithm4(sequence,num) 6. print('当list长度为10时,运行时间分别为:',time_1_1,time_2_1,time_3_1) 7. 8. print('########################') 9. sequence,num = create_sequence(100) 10. result,time_1_2 = algorithm1(sequence,num) 11. result,time_2_2 = algorithm2(sequence,num) 12. result,time_3_2 = algorithm4(sequence,num) 13. print('当list长度为100时,运行时间分别为:',time_1_2,time_2_2,time_3_2) 14. 15. print('########################') 16. sequence,num = create_sequence(1000) 17. result,time_1_3 = algorithm1(sequence,num) 18. result,time_2_3 = algorithm2(sequence,num) 19. result,time_3_3 = algorithm4(sequence,num) 20. print('当list长度为100时,运行时间分别为:',time_1_3,time_2_3,time_3_3)
1.当list长度为10时,运行时间分别为: 7.943201645759982e-05 2.1419869606543776e-05 5.3549674016359475e-06 2.######################## 3.当list长度为100时,运行时间分别为: 0.030387208767866623 0.0015895328237189449 2.5436095157760352e-05 4.######################## 5.当list长度为100时,运行时间分别为: 33.7867263745532 0.12402506124743695 0.0002463285004736804
视频中还介绍了一种分而治之的算法暂未实现。