分治法实现寻找最小值及所有最小值位置,python实现

该博客介绍了如何运用分治策略在Python中查找输入数组中的最小值及其所有出现的位置。通过递归将数组不断二分,最终解决规模为1的问题,然后逐步合并子问题的结果,比较最小值并合并相同最小值的位置。全局变量count用于记录基本操作次数,但未在返回结果中体现。示例展示了在给定数组中找到最小值4及其位置[1, 8, 12]。
摘要由CSDN通过智能技术生成

python实现
A为输入的数组,begin与end是指向当前小数组头尾
min是最小值,minlist是保存对应最小值位置的数组

逻辑过程:(参考文末分治排序过程图,懒得专门画图了)
1.先把输入一次一次二分成为最小的问题(子数组),见代码中段递归调用自己
2.最小的问题是子数组只有一个元素,每个单个作为最小值和记录它位置的list,见代码前段终止条件及操作,但是A【begin】==min可能是多余操作,应该不会执行。
3.一层层合并,比对最小值,选小的返回给上一层,一样就把list合并,见代码后段。
可以设全局count记录basic operation次数

# count = 0
def find_mins(A,begin,end,min,minlist):
    '''设值结束情况,即分问题只有一个数字的情况'''
    if begin == end:
        if A[begin]< min:
            min = A[begin]
            minlist = [begin]
        elif A[begin]==min:
            minlist.append(begin)
        return min,minlist
    '''递归调用自己,分割问题,传递子问题所在子数组在原数组的的左右边界,
    后面两个用来记录当前情况,用户合并。'''
    tempmin1, tempminlist1 = find_mins(A,begin,int((begin+end)/2),min,minlist)
    tempmin2, tempminlist2 = find_mins(A,int((begin+end)/2+1),end,min,minlist)
    # global count
    # count=count+1
    '''归并,一层层把子问题的结果比较并且合并'''
    if tempmin1 < tempmin2:
        return tempmin1, tempminlist1
    elif tempmin1 > tempmin2:
        return tempmin2, tempminlist2
    elif tempmin1 == tempmin2:
        minlist = tempminlist1+tempminlist2
        return tempmin1, minlist

'''示例'''
A = [12,4,3125,21,100,5435,66,454,4,8,8,8,4]
min,minlist = find_mins(A,0,len(A)-1,100000,[])
print(str(min))
print(minlist)

输入数组:
[12,4,3125,21,100,5435,66,454,4,8,8,8,4]
运行结果,显示最小值以及所有其所在的位置:
4
[1, 8, 12]

参考分治排序思想:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值