最长增长子序列的应用

时间:2012-09-17 11:53:42

标签: algorithm language-agnostic

解决其他CS问题时LIS(Longest Increasing Subsequence)问题有多大用处?有一些算法,使用耐心排序,动态编程或决策树。这些如何在现实生活中使用 - 可能是数据流还是其他什么?

提醒你,我用粗体添加最长的序列

{ 0 ,8,4,12, 2 ,10, 6 ,14,1, 9 ,5,13,​​3, 11 ,7, 15 }。

作为奖励,有没有办法使用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

1 个答案:

答案 0 :(得分:6)

LIS的一个有趣的实际应用是Patience Diff,diffing Bram Cohen算法,由Bazaar(BitTorrent的创建者)在Longest Common Subsequence版本控制系统中使用。

常规diff算法涉及计算两个文档之间的LCS(Patience Sort)。虽然效率很高,但这种方法存在一个问题,即结果往往不太适合人类。

常规差异如何失败的简单示例:

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

 void func2() {
     x += 2
 }

Patience Diff算法的优势在于它可以更准确地计算差异,其方式更接近于人类的表现方式。

在之前的案例中,Patience Diff更好地发现了差异:

 void func1() {
     x += 1
 }

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

简而言之,算法是:

  1. 查找两个文档共有的唯一行。
  2. 从第一个文档中取出所有这些行,并根据它们在第二个文档中的外观进行排序。
  3. 计算结果序列的LIS(通过执行the code),得到最长的匹配行序列,两行文档之间的对应关系。
  4. 在已经匹配的行之间的每个行范围内递归算法。
  5. 看看{{3}}。