一、实验目的
1. 了解分治策略算法思想及基本原理;
2. 掌握使用分治算法求解问题的一般特征;
3. 掌握分解、治理的方法;
4. 能够针对实际问题,能够正确的分解、治理,设计分治算法;
5. 能够正确分析算法的时间复杂度和空间复杂度。
二、实验平台
1. Windows操作系统或Linux操作系统;
2. Python3.x;
3. PyCharm或Sublime或Jupyter Notebook。
三、实验内容
最小值问题: 求n个元素的最小值。
四、算法设计
1.问题分析
(1)所选实验项目给定的已知
给定n个元素的集合。
(2)求解目标
求出这n个元素中的最小值。
(3)条件
n个元素的集合已知。
2.问题建模
已知:一个包含n个元素的数组a=(a1,a2,...,an)
求解目标:数组a中的最小值 min{ai},i∈[1,n]
其中,ai表示数组a中的第i个元素,nai表示数组中的最小值,min{}表示求解内部元素的最小值,i∈[1,n]表示i的取值范围为[1,n],即i从1到n遍历。
3.算法描述
初始化一个变量min_value为正无穷大或者将min_value设置为集合中的第一个元素。
遍历集合中的每个元素:
如果当前元素小于min_value,则将min_value更新为当前元素。
返回min_value作为集合中的最小值。
四、算法源码
Min = 99999
def getMin(arr, left, right):
global Min
left = int(left)
right = int(right)
if right - left <= 1:
if (arr[left] < arr[right]):
if Min > arr[left]:
Min = arr[left]
else:
if Min > arr[right]:
Min = arr[right]
else:
mid = (right - left) / 2 + left
getMin(arr, left, mid)
getMin(arr, mid, right)
def main():
print("请输入数组:")
shuzu = []
t = input().split(" ")
for tt in t:
shuzu.append(int(tt))
left = 0
right = len(shuzu) - 1
getMin(shuzu, left, right)
print("Min = %d" % Min)
if __name__ == '__main__':
main()
-
五、测试数据
- 第一组数据
(1)输入
12 64 95 36 1 38 4
(2)输出
Min = 1
2、第二组数据
(1)输入
6 7 3 4 9 2 23
(2)输出
Min = 2
3、第三组数据
(1)输入
23 54 12 94 75 30 10
(2)输出
Min = 10
六、算法分析
算法结果:
算法的结果是集合中的最小值。
时间复杂度:
算法中的遍历操作需要访问集合中的每个元素,因此时间复杂度为O(n),其中n是集合中元素的个数。算法的时间复杂度与集合中元素的个数成线性关系。
空间复杂度:
算法的空间复杂度主要取决于存储集合元素的数据结构,以及其他辅助变量的空间消耗。对于仅需求解最小值的问题,通常只需要维护一个额外的变量来存储当前的最小值,因此空间复杂度为O(1)。
七、实验总结
该段代码使用了分治算法来求解一个数组中的最小值。其基本思想是将问题分解为较小的子问题,分别解决,然后将子问题的解合并起来得到原问题的解。
具体地,该算法首先检查数组中是否只有一个元素,如果是,则返回该元素。否则,将数组划分为两个子问题,分别递归求解左子数组和右子数组的最小值,最后将左右子问题的最小值合并起来即可得到数组的最小值。该算法的时间复杂度为O(nlogn),其中n是数组的大小。实验结果表明,该算法能够在很短的时间内找到数组的最小值。如果要优化该算法的话,可以考虑使用其他数据结构来存储数组,从而更好地利用数组中的信息,提高算法的效率。同时,为了防止出现溢出的情况,应该使用更为安全的整数类型。