基本思想
当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。
我的理解就是“分而治之”,将一个大问题分解成若干个子问题,一般情况下分为2个,然后将分解后的且已经解决的各块合并,求解。
案例一
求顺序表的最大值
import time
def get_max(List):
A=max(List)
return A
def get_fz(List):
n=len(List)
if n<=2: #若问题模块小于或等于2
return get_max(List)
#分解子问题模块
left_list,right_list=List[:n//2],List[n//2:]
#递归,分治
left_max,right_max=get_fz(left_list),get_fz(right_list)
return get_max([left_max,right_max])
if __name__ == '__main__':
num=[i for i in range(1000)]
s_1=time.time()
print(get_fz(num))
案例二
判断某个元素是否在列表中
def is_in_list(List,n):
return [False,True][List[0]==n] #判断为真返回True,为假返回False
def solve(List,N):
n=len(List)
if n==1:
return is_in_list(List,N)
#分解,子问题规模没n/2
left_list,right_list=List[:n//2],List[n//2:]
#递归,分治,合并
res=solve(left_list,N) or solve(right_list,N)
return res
if __name__ == '__main__':
List1=[i for i in range(10)]
print(solve(List1,22))
print(solve(List1,3))
案例三
找出一组序列中最小的值
def partition(seq):
pi=seq[0]
lo=[x for x in seq[1:] if x<=pi]
hi=[x for x in seq[1:] if x>pi]
return lo,pi,hi
def select(seq,k):
#分解
lo,pi,hi=partition(seq)
m=len(lo)
if m==k:
return pi
elif m<k:
return select(hi,k-m-1) #递归,分治
else:
return select(lo,k) #递归分治
if __name__ == '__main__':
List2=[i for i in range(20)]
#查找
print(select(List2,4))
print(select(List2,6)) #从0开始
可以关注微信公众号,免费获取学习资源,每周都有更新