赞
踩
分治法从字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或者更多相同或者相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题解的合并。利用分治算法解决寻找一个数组元素中的最值问题和快速排序算法的过程相似,可以参照着快速排序算法的思路来解决问题。
(1) 先解决小规模的问题,如序列中只有一个元素或者只有两个元素时候的情况。
(2) 将问题分解,如果序列中的元素超过两个的情况,继续将数组分解为两个更小的数组。
(3) 递归解决各自的问题,将其中分解的两个小序列再进行以上的两个步骤,最后将整个问题全部转化为小规模的问题。
(4) 最后将以上所有子问题的解进行比较最终得到原问题的解。
(1) 求解数组中的最大值与最小值,最终是要将所有子问题得到的解进行比较,得出最值。因此,我们的想法是直接先定义两个全局变量来保存最大值与最小值。
(2) 接下来利用分治法的思想来解决问题,写一个分治的函数,其中传入三个参数,依次为传入序列,左端点的下标和右端点的下标。
(3) 如果右端点与左端点下标之差值小于等于1时,则说明序列中只存在至多2个元素,此时将左端点和右端点与两个全局变量进行比较,取最大值与全局最大值进行比较,如果大于,则将该值重新赋予全局最大值,取最小值与全局最小值进行比较,如果小于,则将该值重新赋予全局最小值。若两个端点下标相差大于1,则继续进行递归划分。
(4) 因为python3.6版本中,默认输入为字符串。因此在输入数组时采用split()函数对输入的字符串以" "为界进行分离取值,存放到一个列表中。
(5) 计算程序运行的时间,采用函数库里的clock()函数,在分治法前后分别调用clock()函数记录当前时间,再将两个时间作差值,计算算法实现的运行时间。
- import time
-
- Max = -99999
- Min = 99999
-
- def getMax_Min(arr,left,right):
- global Max,Min
- left = int(left)
- right = int(right)
- if right - left <=1:
- if(arr[left] < arr[right]):
- if Max < arr[right]:
- Max = arr[right]
- if Min > arr[left]:
- Min = arr[left]
- else:
- if Max < arr[left]:
- Max = arr[left]
- if Min > arr[right]:
- Min = arr[right]
- else:
- mid = (right - left)/2 + left
- getMax_Min(arr,left,mid)
- getMax_Min(arr,mid,right)
-
- def main():
- print("请输入数组:")
- shuzu=[]
- t = input().split(" ")
- time1 = time .clock()
- for tt in t:
- shuzu.append(int(tt))
- #time.sleep(10,)
- left = 0
- right = len(shuzu) - 1
- getMax_Min(shuzu,left,right)
- time2 = time.clock()
- print("MAX = %d"%Max)
- print("Min = %d"%Min)
- print("程序运行时间:%f"%(time2 - time1))
-
- if __name__ == '__main__':
- main()
-
-
-
-
-
-
在对数组进行输入时,采用split()函数分隔,每个元素之间有且只能有一个空格隔开,并且在最后一个元素后面不能有空格,否则会报错。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。