python演算法 分治

2022-09-13 13:18:10 字數 2285 閱讀 5005

#分治思想

#基本思想:將乙個問題分成許多個規模最小子問題去解決

#注意分治法能解決的問題一般具有以下幾個特徵:

#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.多數元素 應用舉例 通過應用舉例分析理解分治演算法的原理其實並不難,但是要想靈活應用並在程式設計中體現這種思想中 卻並不容易。所以,這裡這裡用分治演算法應用在排序的時候的乙個栗子,加深對分治演算法的理解。相關概念 一般通過計算有序對或者逆序對的個數,來表示資料的有序度或逆序...