2.Python算法之分治算法思想
生活随笔
收集整理的這篇文章主要介紹了
2.Python算法之分治算法思想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
1.什么是分治算法?
2.為什么需要分治算法?
3.分治算法基礎
4.分治算法的解題一般步驟
5.?用分治算法--求順序表中的最大值
5.?用分治算法--判斷某個元素是否在列表中
6.?用分治算法--找出一組序列中第K小的元素
1.什么是分治算法?
? ?分治算法就是對一個問題采取各個擊破的方法,將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。只要求出子問題的解,就可得到原問題的解。
2.為什么需要分治算法?
? ??在編程過程中,經常遇到處理數據相當多、求解過程比較復雜、直接求解比較耗時的問題。
? ? ?在求解這類問題時,可以采用各個擊破的方法。
3.分治算法基礎
? ? 具體做法是:先把這個問題分解成幾個較小的子問題,找到求出這幾個子問題的解法后,再找到合適的方法,把它們組合成求整個大問題的解。如果這些子問題還是比較大,可以繼續把它們分成幾個更小的子問題,以此類推,直至可以直接求出解為止。這就是分治算法的基本思想
4.分治算法的解題一般步驟
? ? (1)分解,將要解決的問題劃分為若干個規模較小的同類問題。
? ? (2)求解,當子問題劃分得足夠小時,用較簡單的方法解決。
? ? (3)合并,按原問題的要求,將子問題的逐層合并構成原問題的解。
5.?用分治算法--求順序表中的最大值
# 基本子算法(子問題規模小于或等于2時) def get_max(max_list):return max(max_list)# 分治法 def solve(init_list):list_length = len(init_list)# 若問題規模小于或等于2時,直接調用方法解決完成if list_length <= 2:return get_max(init_list)# 問題規模大時,開始分治算法的步驟# 1.分解(子問題的規模為 n/2),分別取列表其中的前半部分和后半部分left_list = init_list[:list_length // 2]right_list = init_list[list_length // 2:]# 2.分治、遞歸(一直遞歸,分解,知道求出前半部分的最大值,和后半部分的最大值)left_max = solve(left_list)right_max = solve(right_list)# 3.合并 (在把前半部分的最大值和后半部分的最大值做個比較,相當于求整個大數組的最大值)return get_max([left_max, right_max])if __name__ == '__main__':test_list = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]# 打印出最大值print(solve(test_list))# 96845.?用分治算法--判斷某個元素是否在列表中
# 子問題算法(子問題規模為1) def is_in_list(init_list, el):return [False, True][init_list[0] == el]# 分治法 def solve(init_list, el):list_length = len(init_list)if list_length == 1: # 若問題規模等于1,即列表中return is_in_list(init_list, el)# 分解(子問題規模為 n/2)left_list = init_list[:list_length // 2]right_list = init_list[list_length // 2:]# 分治合并 遞歸(一直進行拆分, or 只有所有都是 False,才返回假 False)# 所以只要有一個元素在里面,就判定元素在該列表中,res = solve(left_list, el) or solve(right_list, el)return resif __name__ == '__main__':test_list = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]# 查找print(test_list)print("判斷45是否在列表中:", solve(test_list, 45))print("判斷4是否在列表中:", solve(test_list, 4))運行結果:
6.?用分治算法--找出一組序列中第K小的元素
# 劃分(基于主元 pivot) def partition(seq):pi = seq[0] # 挑選主元min_pi = [x for x in seq[1:] if x <= pi] # 所有小于主元的元素max_pi = [x for x in seq[1:] if x > pi] # 所有大于主元的元素return pi, min_pi, max_pi# 查找第 K 小的元素 def select(seq, k):# 分解pi, min_pi, max_pi = partition(seq)min_pi_length = len(min_pi) # 所有小于主元的元素長度# 如果查第 k 小的元素剛好和 比主元小的元素列表長度 相等,則此時pi(主元)則剛好為第K小的元素if min_pi_length == k:return pi# 長度小于k時,elif min_pi_length < k:# 分治、遞歸return select(max_pi, k - min_pi_length - 1)else:# 分治、遞歸return select(min_pi, k)if __name__ == '__main__':seq = [12, 6, 5956, 7, 8, 98, 46, 46, 4, 451, 9684, 4]print(seq)print("列表中第3小的:", select(seq, 3))print("列表中第1小的:", select(seq, 1))運行結果:
總結
以上是生活随笔為你收集整理的2.Python算法之分治算法思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.设计模式中状态模式(对象的行为模式)
- 下一篇: 3.Python算法之贪心算法思想