【问题标题】:Applications of Longest Increasing Subsquence最长递增子序列的应用
【发布时间】:2012-09-09 15:11:17
【问题描述】:

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

为了提醒你,我用粗体表示最长的递增序列

{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

【问题讨论】:

  • 长度为 mn+1 的序列将具有长度为 m+1 的递增子序列(不是 m)或长度为 n+1 的递减子序列b>(不是 n)。 16=3x5+1,所以应该有长度为 5+1=6 的递增或递减子序列。
  • 抱歉编辑。我有问题

标签: algorithm language-agnostic


【解决方案1】:

LIS 的一个有趣的实际应用是 Patience Diff,它是 Bram Cohen(BitTorrent 的创建者)的 diffing 算法,用于 Bazaar 版本控制系统。

常规差异算法涉及计算两个文档之间的 LCS (Longest Common Subsequence)。虽然效率很高,但这种方法有一个问题,那就是——结果往往碰巧不太人性化。

一个简单的例子说明常规 diff 可能会如何失败:

 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(通过执行 Patience Sort),获得最长的匹配行序列,即两个文档的行之间的对应关系。
  4. 在已匹配行之间的每个行范围内递归算法。

看看the code

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多