2012-09-17 99 views
5

解決其他CS問題的LIS(Longest Increasing Subsequence)問題有多大用處?有幾個算法,使用耐心排序,動態編程或決策樹。這些在現實生活中如何使用 - 可能是數據流或什麼?最長增加子序列的應用

爲了提醒你,我把以粗體最長遞增序列

{,8,4,12,,10,,14,1,,5 ,13,3,,7,}。

作爲獎勵,有什麼方法可以使用結果a sequence of length mn + 1 will have an increasing subsequence of length m or a decreasing subsequence of length n?例如。我們的列表長度爲16,所以應該有一個增加的長度爲5或長度爲5的序列。在我們的例子中,爲0,2,6,9,11,15

也是一個遞增的長度爲8或長度爲3的序列的序列:在本例中爲12,10,1

+2

長度爲mn + 1的序列將具有長度增加的子序列** m + 1 **(不是m)或長度減少的子序列** n + 1 **(不是n)。 16 = 3x5 + 1,所以應該有一個長度爲5 + 1 = 6的增加或減少的子序列。 – Kwariz

+0

抱歉編輯。我得到了問題 – Imposter

回答

3

LIS的一個有趣的實際應用是在Bazaar版本控制系統中使用的Patience Diff,diffing算法Bram Cohen(BitTorrent的創建者)。

常規差異算法包括計算兩個文檔之間的LCS(Longest Common Subsequence)。雖然效率很高,但這種方法存在問題,即結果往往不太人性化。

的如何一個常規的diff可能失敗一個簡單的例子:

void func1() { 
    x += 1 
+} 
+ 
+void functhreehalves() { 
+ x += 1.5 
} 

void func2() { 
    x += 2 
} 

耐心DIFF算法的優點在於,它允許以更精確地計算的差異,以這樣的方式更緊密地對應於如何人會執行。

在上述情況下耐心DIFF察覺的差別更好:

void func1() { 
    x += 1 
} 

+void functhreehalves() { 
+ x += 1.5 
+} 
+ 
void func2() { 
    x += 2 
} 

概括地說,算法是:

  1. 找到獨特的線,兩者共同文件。
  2. 從第一個文檔中取出所有這些行,並根據它們在第二個文檔中的外觀進行排序。
  3. 計算結果序列的LIS(通過執行Patience Sort),獲得最長的匹配序列,即兩個文檔的行之間的對應關係。
  4. 在已經匹配的行之間的每行範圍內對算法進行遞歸計算。

看看the code