#分治思想#基本思想:將乙個問題分成許多個規模最小子問題去解決
#注意分治法能解決的問題一般具有以下幾個特徵:
#1.該問題的規模小到一定程度就可以容易地解決
#2.該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質
#3.利用該問題分解出的子問題的解可以合併為該問題的解
#4.該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子問題
#例1.給定乙個數字列表,編寫乙個求出其最大值的分治演算法(最小規模為2個數)
def get_max(numlist):
return max(numlist)
def solution(numlist):
n = len(numlist)
if n<2:
return get_max(numlist)
temp_list = [numlist[i:i+2] for i in range(0,n,2)]
print('^^^^')
print(temp_list)
max_list = list(map(get_max,temp_list))
print(max_list)
if len(max_list) == 1:
return max_list[0]
else:
return solution(max_list)
print(solution([1,4,2,6,48,56,97,0,7,8,67,100,87]))
# ^^^^
# [[1, 4], [2, 6], [48, 56], [97, 0], [7, 8], [67, 100], [87]]
# [4, 6, 56, 97, 8, 100, 87]
# ^^^^
# [[4, 6], [56, 97], [8, 100], [87]]
# [6, 97, 100, 87]
# ^^^^
# [[6, 97], [100, 87]]
# [97, 100]
# ^^^^
# [[97, 100]]
# [100]
#例2.給定乙個列表,利用分治思想判斷某個數是否在其中(該問題的最小規模為1)
def isinlist(numlist,x):
return true if numlist[0] == x else false
def solution1(numlist,x):
n = len(numlist)
if n == 1:
return isinlist(numlist,x)
leftpart, rightpart = numlist[:n//2],numlist[n//2:]
print(leftpart)
return solution1(leftpart,x) or solution1(rightpart,x)
print(solution1([1,4,2,6,48,56,97,0,7,8,67,100,87], 4))
# [1, 4, 2, 6, 48, 56]
# [1, 4, 2]
# [1]
# [4]
#例3:爬樓梯:假設你正在爬樓梯,需要n步你才能到達頂部。但每次你只能爬一步或者兩步,你能有多少種不同的方法爬到樓頂部?(類似斐波那契數列,1,2,3,5,8...)
def climb(n):
if n<=2:
return n
else:
return climb(n-1) + climb(n-2)
print(climb(5))
#例4:漢諾塔
def move(n, a, buffer, c):
if n == 1:
print(a, "->", c)
else:
# 遞迴(線性)
move(n - 1, a, c, buffer)
move(1, a, buffer, c) # 或者:print(a,"->",c)
move(n - 1, buffer, a, c)
move(3, "a", "b", "c")
# ('a', '->', 'c')
# ('a', '->', 'b')
# ('c', '->', 'b')
# ('a', '->', 'c')
# ('b', '->', 'a')
# ('b', '->', 'c')
# ('a', '->', 'c')
python演算法之分治演算法
當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾...
演算法 分治演算法
分治策略主要利用遞迴來解決問題,它包括以下三個步驟 分解 將問題分解為一與原問題類似並且比原問題規模更小的子問題 解決 當分解的子問題足夠小時,直接給出答案,否則用遞迴打方式求解 合併 將子問題的解合成原問題的解 下面考慮乙個簡單的利用分治演算法的歸併排序的例子 問題的形式化描述如下 輸入 a是 乙...
演算法 分治演算法
leetcode 169.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...