分治算法实践

一、实验目的

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. 第一组数据

(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是数组的大小。实验结果表明,该算法能够在很短的时间内找到数组的最小值。如果要优化该算法的话,可以考虑使用其他数据结构来存储数组,从而更好地利用数组中的信息,提高算法的效率。同时,为了防止出现溢出的情况,应该使用更为安全的整数类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值