homework-01 "最大子数组之和"的问题求解过程
写在前面:我的算法能力很弱,并且也是第一次写博文,总之希望自己能在这次的课程中学到很多贴近实践的东西吧。
1、这次的程序是python写的,这也算是我第一次正正经经地拿python来写东西,结果上来说光是语法上就出了不少问题,总是写写停停,时不时要百度、Google一下。最麻烦的是因为我习惯使用sublime作文本编译器,结果还有无法使用中文注释的问题没有解决,很是捉急。(后来经杰仔教导,注释问题解决,我不会说我只是把第一行打错了 = =)
2、“最大子数组之和”问题的一维问题(我是这么叫的)在助教的博客里面已经被解决,并且得出了非常漂亮的O(n)的解法。理所当然地,我希望在这一基础上,通过一个矩阵地不断推进来解决“最大子数组之和“的二维问题。
但是,这一想法很快遇到了阻力。在二维空间中一个矩形的形状变化有很多种,并且所涉及的改变处的数字和很难统计,也无法简单地设计出遍历所有可能情况的算法。
于是我希望将该二维问题化为一维问题来解决。为此,我将行数通过两次循环遍历,相当于将问题划归成n(n+1)/2个“最大子数组之和”问题的一维问题。每一问题即为在行数限定、列数可变的数组内寻找最大子数组之和的问题。
于是所得代码如下,
# coding:utf-8 ''' 2013-9-17 XTH ''' n1 = raw_input("please input the row number of array") #the row number of array n2 = raw_input("please input the line number of array") #the line number of array f = open(n1 + "," + n2 + ".txt","r") num=[[]]*int(n1) for i in range(0,int(n1)): line = f.readline() line = line.strip('\n') num[i] = line.split(",") num=[[int(x) for x in inner] for inner in num] # 从一个txt文件中读入测试数据(测试数据由另一个python程序产生) # 该问题的解决思路即通过两次循环遍历将该二维问题转化为多个一维问题 def max_2d(num,n1,n2): line = [0]*n2 max_sum = 0 #最大和 fore_sum = 0 # now_sum = 0 #当前和 x = [0]*2 y = [0]*2 for i in range(0,n1): for j in range(i,n1): x[0] = i y[0] = 0 for k in range(0,n2): line[k] += num[j][k] if fore_sum <0: now_sum = 0 y[0]=k now_sum += line[k] if now_sum > max_sum: max_sum = now_sum y[1]=k x[1]=j x2=x[0] y2=y[0] now_sum = 0 now_sum=0 line = [0]*n2 return "the max num is " + str(max_sum) + "\n"+ "the area is " + str(x2) + "," + str(y2) + " to " + str(x[1]) + "," + str(y[1]) print(max_2d(num,int(n1),int(n2)))
然后是生成测试数据的代码:
import random x = raw_input("please input row number of array") y = raw_input("please input line number of array") filename = x + "," + y + ".txt" f = open(filename,"w") for i in range(0,int(x)): for j in range(0,int(y)): f.write(str(random.randint(-50,100))) if j<int(y)-1 :f.write(",") f.write("\n") f.close()
对于测试数据
有运行结果
经过人工验证,结果无误。