iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

概念

深度優先搜尋是一種圖的走訪方式。以一個圖的例子來解釋:圖上有編號為 https://chart.googleapis.com/chart?cht=tx&chl=1https://chart.googleapis.com/chart?cht=tx&chl=6 的節點。如果我們從節點 https://chart.googleapis.com/chart?cht=tx&chl=1 開始走,我們會先往與節點 https://chart.googleapis.com/chart?cht=tx&chl=1 相鄰的節點走,然後一直往下走,直到無法再往下走為止。接著,我們會回到上一層,再以相同的方式往另一個相鄰節點走。

實作

通常,我們實現深度優先搜尋會使用遞迴的方式,或者更深入的概念是使用堆疊(stack)。但值得注意的是,在遞迴過程中,函數的呼叫實際上就已經包含了堆疊的操作,因此我們不需要手動操作堆疊。

簡易範例實作 code:

void dfs(int depth,int start){
    if(depth == k){
        for(int i = 0;i < k;i++){
            cout << ans[i] << " ";
        }
        return;
    }else{
        for(int i = start;i < n;i++){
            ans[depth] = num[i];
            dfs(depth + 1,i);
        }
    }
}

DFS 暴搜

此為 DFS 的變化型,用於通過 DFS 方式訪問各種可能的結果,也可以視為圖中各種可能的走法。DFS 通常用於計算骰子點數、多個號碼的排列組合、撲克牌的排列組合等問題。這些問題通常需要額外的記憶體空間來儲存答案,在 DFS 的遞迴深度達到預期深度後才一次性輸出結果。

在明天會有相關類題給大家練習

DFS 困難的應用

DFS 除了上述的應用之外,還可以用於更多領域,例如在樹的遍歷、拓撲排序、八皇后問題、數獨解題等等。不過,我的目標是確保大家可以輕鬆理解 DFS 的概念和簡單實作,所以目前不會深入介紹這些例子。如果你對它們感興趣,可以參考之前的資源分享,那裡有許多相關的文章和示例。

總結

深度優先搜尋(DFS)是一種圖形遍歷方法,適用於各種應用,從圖形遍歷到排列組合等不同領域。我們從一個起點開始,遞迴地深入探索,然後回溯以繼續其他可能的選擇

在這篇文章中,我們介紹了基本概念,提供簡單的實作示例,並討論變種應用,例如暴搜。我們也提到困難應用,如在樹的遍歷、拓撲排序、八皇后、數獨求解等。

儘管 DFS 可以應用於各種複雜的問題,但本文的目標是幫助讀者建立對 DFS 的基本理解並提供入門實作示例,所以就只有基本概念。希望這篇文章能夠幫助你開始使用學習 DFS,並解決各種問題。


上一篇
Day-16 二分搜尋例題講解
下一篇
Day-18 深度優先搜尋例題講解
系列文
從競賽程式學習資料結構與演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言