解决其他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 。
答案 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
}
简而言之,算法是:
看看{{3}}。