【问题标题】:Why does j = n + 1 in the termination loop invariant of the insertion sort algorithm?为什么插入排序算法的终止循环不变量中的 j = n + 1 ?
【发布时间】:2017-11-07 22:43:39
【问题描述】:

我目前正在阅读 TCRC Introduction to Algorithms 3rd edition 教科书的第 2 章,并且正在阅读作者对该算法的循环不变量的解释。我理解作者的初始化和维护逻辑。然而,终止是我有点陷入困境的。作者声称在终止时,j = n + 1。然而,在算法的伪代码中,j 从 2 循环到 n。那么 j = n - 1 不应该吗?

编辑:本书的插入排序伪代码是:

for j = 2 to A.length
    key = A[j]
    // Insert A[j] into sorted sequence A[1...j - 1]
    i = j - 1
    while i > 0 and A[i] > key
        A[i + 1] = A[i]
        i = i  - 1
    A[i + 1] = key

编辑:仔细阅读后,我终于明白为什么 j = n + 1 在终止期间。这是因为 for 循环从 2 变为 n(包括),所以在 j 超过 n 之后,循环终止,因此在终止时 j = n + 1。感谢您的帮助。

【问题讨论】:

  • 你能提供伪代码吗?
  • 您必须提供问题的文本。无法从您发布的内容中看出。
  • 欢迎来到 StackOverflow。请阅读并遵循帮助文档中的发布指南。 on topichow to ask 在这里申请。
  • 抱歉,这是我第一次在这个网站上发帖,所以我不习惯这里的格式和约定。我在编辑的 OP 中提供了伪代码。
  • 在这种情况下n 是什么?是A.length吗?

标签: algorithm insertion-sort loop-invariant


【解决方案1】:

免责声明:这可能完全不正确......这只是一个脑吐。

旁注:由于j 在此循环期间递增,因此起点与结束条件无关。

 for j = 2 to A.length //A.length = n in your question

这个伪代码有一点歧义。

首先,我们假设j 是在这个for 循环之外定义的,并且在循环终止时会有一个结束值。 参见@Dukeling 的评论

其次,您的代码以数组为目标,使用 j 作为索引器:A[j]

for j = 2 to A.length中的to这个词存在歧义,是包括A.length还是不包括A.length?还有这个索引器A[j]

一般情况下,对于A[j] 中的索引器,j 的有效范围是[0...A.length -1]

某些语言使用另一个范围,即:[1...A.length] 我认为这是作者的意图,因为 A[0] 根本没有被击中。

如果是这种情况....并且for 条件在中断循环之前递增j(以测试条件并查看它是否为假),那么...您将得到j = A.length + 1 .

附注:

在常见的C 类似语言中,数组的有效范围为[0...A.length -1]

在这个 C 示例中,c 在终止后的值为 A.length

int c = 0;
for (c = 3; c < A.length; c++)
{

}
//c = A.length after the loop is completed.

【讨论】:

  • 我们不必假设 j 是在循环之外定义的 - j 确实会增加最终时间,而不管它是在哪里定义的。
  • @Dukeling:你在第一部分是对的,但至于第二部分,关注 0 索引,我认为这就是导致 OP 困惑的原因。不过不确定。
  • 在阅读了作者使用的伪代码约定(与 OP 中的伪代码相同的部分)之后,我相信作者指定索引 j 位于位置 n + 1,考虑到这种情况是有道理的索引超过数组的最后一个元素后循环结束。
猜你喜欢
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2018-10-02
相关资源
最近更新 更多