日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分治:分治和动态规划的区别,二分检索递归和迭代方式实现

發布時間:2024/9/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治:分治和动态规划的区别,二分检索递归和迭代方式实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分治法

分治一般可以直接使用遞歸實現,在不考慮空間消費的情況下和迭代方式時間消耗相差不多

==================================================================

分治一般形式: T(n) = k*T(n/m) + f(n)

k為子問題個數,一般均分或者等比分

n/m問題規模,一般情況下m已經確認了子問題的個數,可以通過變換減少為a個

f(n) 為數據的處理,劃分和綜合工作量,可以增加預處理,從而減少在遞歸里面的操作

也就是把遞歸里面的操作盡量放在循環體外面處理

==================================================================

問題規模和個數k*T(n/m),k<=m,當然理論上也有T(n-m)的情況,在這種情況下子問題變得很多,且子問題可能相互依賴,不獨立,無法逐個解決,需要按照順序解決子問題,通常那種情況下使用動態規劃解決。

所以可以看出來分治和動態規劃的區別:一個子問題多,多的還有存在依賴,一個子問題少,且子問題獨立,從一般的狀態轉移方程也可以看出區別,一個是減法衰減,一個是除法衰減。

這里還有一個思考,假如一個問題可以分解成很多個子問題,且子問題獨立,這時直接使用分治或者是直接使用動態規劃,都是和蠻力算法沒有區別,這時就需要考慮使用分治優化策略,減少子問題k,或者通過減少步驟f(n)來優化。

二分檢索

二分檢索原問題可以看成3個情況,檢索目標就在middle,檢索目標在middle左邊,檢索目標在middle右邊,f[left,right] = f[middle] or f[left,middle-1] or f[middle+1,right],

實際上二分檢索可以看成分支限界法,arr[middle] 和 target比較剪枝,是分支限界的話,那么就需要知道解空間,解空間就是,檢索目標的位置,通過深度增加,不斷精確檢測目標的位置,直到位置精確到1,[模糊位置,縮小范圍,縮小范圍,…,精確到1],這個過程是滿足多米諾性質的,可以用剪枝來減少搜索空間。

#%% # 注意遞歸的返回值,遞歸的要返回的話,要前后一致,或者直接基于某一層考慮,把遞歸看成結果 def binary_Serach_recursive(arr,left,right,target):middle = (left + right) // 2# 遞歸出口if left > right :return(-1)if arr[middle] == target:return(middle)elif arr[middle] < target:# 這里沒有return的話,結果就沒法return出來return binary_Serach_recursive(arr,middle+1,right,target)else:return binary_Serach_recursive(arr,left,middle-1,target)def binary_Serach_iterative(arr,target):left = 0right = len(arr)-1# 循環體條件while left <= right:middle = (left + right) // 2if arr[middle] == target:return middleelif arr[middle] < target:left = middle +1else:right = middle -1return -1#%% arr = [7,3,66,33,22,66,99,0,1] sort_arr = sorted(arr) print(sort_arr) print(binary_Serach_recursive(sort_arr,0,len(arr)-1,22)) print(binary_Serach_recursive(sort_arr,0,len(arr)-1,100)) print(binary_Serach_iterative(sort_arr,22)) print(binary_Serach_iterative(sort_arr,100))[0, 1, 3, 7, 22, 33, 66, 66, 99] 4 -1 4 -1 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的分治:分治和动态规划的区别,二分检索递归和迭代方式实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。