簡體   English   中英

如果記憶是自上而下的深度優先,而 DP 是自下而上的廣度優先,那么自上而下的廣度優先/自下而上的深度優先等價物是什么?

[英]If memoization is top-down depth-first, and DP is bottom-up breadth-first, what are the top-down breadth-first / bottom-up depth-first equivalents?

我剛剛閱讀了 Krishnamurthi 教授撰寫的關於遞歸記憶與動態編程的心智模型的簡短文章 在其中, Krishnamurthi將記憶化的自頂向下結構表示為遞歸樹,將 DP 的自底向上結構表示為 DAG,其中源頂點是第一個(可能是最小的)子問題解決,而匯頂點是最終計算(本質上是圖與前面提到的遞歸樹相同,但所有邊都翻轉了)。 很公平,這完全有道理。

不管怎樣,最后他給讀者一個心理練習:

記憶化是對答案的自上而下、深度優先計算的優化。 DP 是對答案的自底向上、廣度優先計算的優化。

我們自然應該問,那呢?

  • 自頂向下,廣度優先
  • 自下而上,深度優先

它們在哪里適合通過權衡空間來避免重新計算的技術空間?

  • 我們已經為他們取了名字嗎? 如果是,是什么?,或者
  • 我們是否遺漏了一兩個重要的技巧?,或者
  • 有什么原因我們沒有這些名字嗎?

然而,他停在那里,對這些問題沒有給出他的想法。


我迷路了,但這里是:

我的解釋是,自上而下、廣度優先的計算需要對每個函數調用進行單獨的處理。 自底向上、深度優先的方法會以某種方式將最終解決方案拼湊在一起,因為每個跟蹤都到達“匯頂點”。 一旦完成所有呼叫,該解決方案最終將“累加”到正確答案。

我怎么樣了? 有人知道他三個問題的答案嗎?

讓我們分析一下這兩個圖中的邊是什么意思。 從子問題ab的邊表示一種關系,其中b的解用於計算a並且必須在它之前求解。 (在另一種情況下反過來。)

會想到拓撲排序嗎?

進行拓撲排序的一種方法是執行深度優先搜索,然后在離開每個節點的途中對其進行處理。 這基本上就是遞歸記憶的作用。 您從每個子問題開始使用深度優先,直到遇到您尚未解決的問題(或您尚未訪問的節點)並解決它。

動態規划,或自下而上 - 廣度優先解決問題的方法涉及解決較小的問題並從中構建解決較大問題的方法。 這是進行拓撲排序的另一種方法,您訪問入度為 0 的節點,對其進行處理,然后將其刪除。 在 DP 中,最小的問題首先被解決,因為它們的入度較低。 (較小是對手頭問題的主觀感受。)

這里的問題是生成必須解決子問題集的序列。 自上而下的廣度優先和自下而上的深度優先都不能做到這一點。 即使進程被分成線程,自上而下的廣度優先最終仍然會做一些與深度優先計數器非常相似的事情。 有一個必須解決問題的順序。 自底向上的深度優先方法可能能夠部分解決問題,但最終結果仍然類似於廣度優先的對應部分。 子問題將以類似的順序解決。

鑒於這些方法與其他方法相比幾乎沒有任何改進,不能很好地與類比轉化並且實施起來很乏味,因此它們還沒有很好地建立。

@AndyG 的評論在這里非常重要。 我也喜歡@shebang 的回答,但這里有一個在這種情況下直接回答這些問題的回答,而不是通過歸結為另一個問題。

只是不清楚自上而下、廣度優先的解決方案會是什么樣子。 但是,即使您以某種方式暫停計算以不進行任何子計算(人們可以想象可能實現這一點的各種基於延續的方案),這樣做也沒有意義,因為會共享子問題。

同樣,自下而上、深度優先的解決方案能否解決這個問題也不清楚。 如果您自下而上進行,但一直在計算的某些脊椎上充電,但其他子問題的解決方案尚未准備好並等待,那么您就是在計算垃圾。

因此,自上而下的廣度優先沒有任何好處,而自下而上的深度優先甚至沒有提供解決方案。

順便說一句,上述博客文章的更新版本現在是我文本中的一個部分(這是 2014 版;期待更新

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM