回溯演算法學習心得

2022-10-09 06:30:10 字數 1467 閱讀 5049

回溯演算法的原理:回溯演算法是一種選優搜尋法,按照選優條件向前搜尋,以達到目標。但當探索到某一步的時候,發現原先選擇並不優活著達不到目標的時候,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法

廢話不多說,直接上解決回溯演算法的框架。解決乙個回溯問題,實際上就是乙個決策樹的遍歷過程。你只需要思考如下3個問題:

回溯法的演算法思想和深度優先搜尋(dfs)的思想較為類似,可以結合著看

**方面,回溯演算法的框架如下所示:

result = 

def backtrack(路徑,選擇列表):

if 滿足結束條件 :

result.add(路徑)

return

for 選擇 in 選擇列表 :

做選擇backtrack(路徑,選擇列表)

撤銷選擇

其核心就是for迴圈裡面的遞迴,在遞迴呼叫之前「做選擇」,在遞迴呼叫之後「撤銷選擇」,就是這樣。

問題描述如下圖所示:

解決問題的**如下所示,可結合起來進行理解:

class solution 

void backtarck(int nums , linkedlisttrack)

for(int i = 0 ; i < nums.length ; i++)

//做選擇

track.add(nums[i]);

//進入下一層決策樹

backtarck(nums,track);

//取消選擇

track.removelast();}}

}

問題描述如下所示:

拓展內容:

計算遞迴演算法時間複雜度的方法:找到遞迴深度,然後乘以每次遞迴中迭代的次數

解法思想:

首先,空集肯定是乙個子集。

然後,以1開頭的子集有哪些呢? 有[1] [1,2] [1,2,3]

同理,以2開頭的子集有[2] [2,3]

以3開頭的子集有[3]

最後,把上面這些子集加起來就是【1,2,3】的所有子集

**解法如下所示:

class solution 

void backtrack(int nums , int start , linkedlisttrack)

}}

可以看見,由start引數實現了剛才所說的「以某個數字開頭的子集」;而對res的更新處在前序遍歷的位置,所以說res記錄了樹上的所有結點,也就是所有的子集

有關括號問題,你只需要記住以下性質,思路就很容易想出來:

排序演算法學習心得

近期終於弄懂了六種演算法,寫個小部落格記錄下 一 六種演算法解析 1 直接插入排序 2 演算法特點 保證每一次遍歷後,前面的資料都是排序好的 2 public static int insert int arr arr pos arr i arr i temp return arr 3 氣泡排序 1...

關於PCA演算法學習心得

壓縮的實質就是針對樣本的屬性,讓單個屬性的方差最大,讓樣本之間的協方差的為零。pca演算法的是針對原始樣本的協方差c的變換,通過對協方差矩陣c的對角化,找到對映後的樣本的協方差矩陣y。需要注意的是,此時d是對角陣,從而滿足了我們優化的要求 協方差為零,方差最大。d 1myy t1m px px t ...

小白演算法學習心得(c )

很長時間沒有寫部落格了,原因主要就是忙著上課或者是學習之類的。絕對不是貪玩 最近簡單的學習了一部分演算法,於是簡單的總結一下自己學習的經歷。前話在大一上學期,學長就開始教我們一些演算法,dp,貪心之類的,但是很長時間就是不了解為什麼要這樣寫,當時也被遞迴弄暈了很長很長時間,於是我寫下這篇簡單的自我學...