回溯法遵循深度優先嗎 閒來刷下 回溯演算法

2021-10-14 15:50:04 字數 2736 閱讀 7369

❝ 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就「回溯」返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。許多複雜的,規模較大的問題都可以使用回溯法,有「通用解題方法」的美稱。

回溯法:一種通過探索所有可能的候選解來找出所有的解的演算法。如果候選解被確認不是乙個解的話(或者至少不是最後乙個解),回溯演算法會通過在上一步進行一些變化拋棄該解,即回溯並且再次嘗試。

回溯問題,實際上就是決策樹的遍歷過程。

❝ 需要思考 3 個問題:
路徑:也就是已經做出的選擇。

選擇列表:也就是你當前可以做的選擇。

結束條件:也就是到達決策樹底層,無法再做選擇的條件。

result = 

function backtrack(選擇列表, 路徑)

for 選擇 of 選擇列表

}

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

全排列窮舉,以開頭為索引起點,遞迴列舉每個起點開始的所有排列情況,遇到自己則忽略,按照以上的技巧來答題;

具體來說就是執行一次深度優先遍歷,從樹的根結點到葉子結點形成的路徑就是乙個全排列。

//給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。

//// 示例:

//// 輸入: [1,2,3]

//輸出:

//[// [1,2,3],

// [1,3,2],

// [2,1,3],

// [2,3,1],

// [3,1,2],

// [3,2,1]

//]// related topics 回溯演算法

//leetcode submit region begin(prohibit modification and deletion)

/** * @param nums

* @return

*/var permute = function (nums)

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

};var result = ,

track = ;

backtrack(nums, track, result);

return result;

};

時間複雜度:o(n * n!),其中n為序列的長度。

空間複雜度:o(n),其中n為序列的長度。除答案陣列以外,遞迴函式在遞迴過程中需要為每一層遞迴函式分配棧空間,所以這裡需要額外的空間且該空間取決於遞迴的深度,這裡可知遞迴呼叫深度為o(n)

這道題是上題的變體,增加了可重複數字的排列,因此再全排列過程中需要進行剪枝去重;

剪枝的前提條件便是:當前索引的值是否已經入棧;當前索引值與前乙個索引值相等並且已經使用過則跳過,此條件需要序列進行前置排序,不然就無法匹配到相鄰的重複值了;

//給定乙個可包含重複數字的序列,返回所有不重複的全排列。

//// 示例:

//// 輸入: [1,1,2]

//輸出:

//[// [1,1,2],

// [1,2,1],

// [2,1,1]

//]// related topics 回溯演算法

//leetcode submit region begin(prohibit modification and deletion)

/** * @param nums

* @return

*/var permuteunique = function (nums) ;

// 排序是剪枝的必要操作

// 為了判斷相鄰的重複資料是否達到剪枝條件

nums.sort();

var backtrack = function (nums, track, used, depth)

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

};backtrack(nums, track, used, 0);

return result;

};//leetcode submit region end(prohibit modification and deletion)

時間複雜度:o(n * n!),這裡n為陣列的長度。

空間複雜度:o(n * n!)

閒來刷下「回溯演算法」 - 掘金​juejin.im

回溯法遵循深度優先嗎 深度優先搜尋(回溯法)

事實上,深度優先搜尋屬於圖演算法的一種,英文縮寫為dfs即depth first search.其過程簡要來說是對每乙個可能的分支路徑深入到不能再深入為止,而且每個節點只能訪問一次.舉例說明之 下圖是乙個無向圖,如果我們從a點發起深度優先搜尋 以下的訪問次序並不是唯一的,第二個點既可以是b也可以是c...

Algorithm 回溯法與深度優先遍歷的異同

1 相同點 回溯法在實現上也是遵循深度優先的,即一步一步往前探索,而不像廣度優先那樣,由近及遠一片一片地掃。2 不同點 1 訪問序 深度優先遍歷 目的是 遍歷 本質是無序的。也就是說訪問次序不重要,重要的是都被訪問過了。可以參見題surrounded regions,深度優先只需要把從邊界起始的 o...

Algorithm 回溯法與深度優先遍歷的異同

1 相同點 回溯法在實現上也是遵循深度優先的,即一步一步往前探索,而不像廣度優先那樣,由近及遠一片一片地掃。2 不同點 1 訪問序 深度優先遍歷 目的是 遍歷 本質是無序的。也就是說訪問次序不重要,重要的是都被訪問過了。可以參見題surrounded regions,深度優先只需要把從邊界起始的 o...