【问题标题】:How to prove correctness of the following algo如何证明以下算法的正确性
【发布时间】:2015-11-29 13:20:00
【问题描述】:

问题是找到任何给定数组的 LIS(最长递增子序列)。 前任。 a[]={10,9,7,8,9}; 长度=3; {7,8,9}

所以在 nlogn 中做的一种方式是

  1. 对数组进行排序
  2. 取两者的LCS 结果是 LIS。

现在我明白了该怎么做。但是我如何证明它是正确的。这里如何申请 MI?

【问题讨论】:

  • 矛盾尝试。假设原始数组中有一个更长的递增子序列,那么....

标签: algorithm lcs lis


【解决方案1】:

在你的情况下不需要归纳,你必须展示三件事:

  • 结果方法捕获递增序列 - 直接来自它是排序数组的一部分这一事实
  • 结果子序列存在于输入数组中 - 直接来自 LCS 的定义(common 子序列)
  • 不再有递增子序列 - 您可以轻松地证明最长序列必须存在于输入序列(根据定义)和排序数组中,因此 LCS 也将对其进行分析,因此它不能更长LCS 返回的那个。

【讨论】:

  • 你确定这是正确的吗?据我记得,LIS 问题可以在 O(nlog(n)) 中解决,而且我认为您的解决方案不能为数组 {10,9,4,5,8,6,7} 提供正确答案 -答案是 {4,5,6,7},但您会发现 {4,5,8},这是错误的长度。您不应该搜索增加的块,而是搜索元素的子序列,不一定彼此相邻。请参阅 wiki 上的示例:en.wikipedia.org/wiki/Longest_increasing_subsequence
  • 这会找到最长的递增连续子序列,这比找到最长的递增子序列要简单一些。
  • @n.m.我同意它找到了最长的连续子序列,但这不是 LIS 问题。是的,它有点简单,但仍然是一个不同的问题,也许问题本身应该改为 LICS 而不是 LIS,因为从问题中我猜这是意图
  • @PiotrPytlik 不,如果您以这种方式更改问题,它将变得不正确(也就是说,会要求证明虚假)。
  • @PiotrPytlik 我的目的是只查找 LIS,而不是 LICS。
猜你喜欢
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多