2017-03-06 116 views
0

最長的common subsequence problem是一個經典的計算機科學問題,解決它的算法是版本控制系統和wiki引擎的根源。兩種基本算法是Hunt–McIlroy algorithm,它用於創建diff的原始版本,以及Myers diff algorithm,它由GNU diff utility當前使用。兩者似乎都或多或少地通過找到表示兩個字符串或文本文件之間的編輯空間的圖表的最短路徑。編輯空間是將一個序列轉換爲另一個序列所需的插入或刪除次數。那麼Myer的差異算法和Hunt-McIlroy算法究竟有什麼區別呢?Myers diff算法vs Hunt-McIlroy算法

回答

1
  • 邁爾斯算法是「分而治之算法」:它的工作原理是尋找遞歸兩個序列的中央配以最小的編輯腳本。一旦完成,只有匹配被記住,並且遞歸地比較它之前和之後的兩個子序列,直到沒有其他要比較的東西。通過儘可能地匹配子序列的末端來找到中心匹配,並且在任何時候不可能的情況下,通過將編輯腳本增加1來掃描每個對角線到達那裏的每個最遠位置並且再次看到多遠比賽可以去,如果一場比賽遇到另一端的比賽,該算法剛剛發現中央匹配。這種方法具有佔用O(m + n)存儲器的優點,並且在執行編輯腳本複雜度時執行。

  • 亨特和麥克羅伊方法計算匹配整個文件,並將它們索引到所謂的k候選。 k是LCS長度。 LCS通過找到屬於正確座標的匹配來逐步增加(遵循他們的論文中的規則)。這樣做的每條路都被記住。這種方法存在的問題是,它的工作量超過了必要的:它記錄了所有的路徑,在最壞的情況下存儲所有的路徑,並且在時間複雜度方面存儲所有的路徑和o(mn log m)

邁爾斯算法主要是贏,因爲它沒有記憶,而工作路徑,並不需要「預見」到哪兒去,這樣就可以在任何時間只在它可能到達的最遠位置集中用最小複雜度的編輯腳本。這個「最小的複雜性」確保找到的是LCS,而不是記住它通過哪條路徑,直到找到匹配使用更少的內存爲止。不要試圖提前計算所有匹配,以避免他們的存儲,並使他們在比賽時間而不是記憶豬。