【问题标题】:Correctness of algorithm to find maximum in array在数组中找到最大值的算法的正确性
【发布时间】:2016-12-11 09:26:05
【问题描述】:

我想用归纳法和矛盾法证明“在数组中找到最大元素的算法”的正确性。

ans=-infinity
for (i=0; i<n; i++)
    ans= max(ans, A[i])

其中A[0:n-1] 是数组,max 是返回其两个参数中最大值的函数。

我在做什么:

基本情况:i=0, ans= max(-infinity,A[0])=A[0],因为只处理了一个元素,所以它是最大值。

归纳假设:i=k&lt;n-1, 假设算法正确找到最多 k 次迭代。

归纳步:i=k+1,令ans_{i}表示算法得到的最大元素直到i步,让ans'_{i}表示数组A[0:i-1]中的另一个最大元素。

然后从归纳假设,ans_{k} = ans'_{k}

现在,为了矛盾起见,假设ans_{k+1} &lt; ans'_{k+1}

现在,我应该如何表现这个矛盾?

有什么建议吗?我应该改变这种方法吗?

【问题讨论】:

  • 属于 math.stackexchange.com(“属于 Stack Exchange 网络中的另一个站点”并没有作为建议提供。说真的,伙计们,很难设置“其他”选项吗?在建议列表中?)
  • 你不需要矛盾的证明,因为归纳证明已经完成了这项工作。
  • 那里的符号多么冗长,如果我理解您想要达到的目标,请击败我。看,问题可以简单地表述为:“如果 M(i-1) 是 arr[0...i-1] 的最大值,那么 M(i)=max(arr[i], M(i-1)) 是 @ 的最大值987654335@"。演示很简单:“如果 M(i-1)>=arr[i],则 M(i-1)=M(i) - 根据最大​​函数定义 - 将大于任何 arr[0...i]。如果 M( I-1)arr[i] 然后arr[i] 大于任何arr[0...i-1] - 通过订单操作的传递性 - 所以 M(i)=arr[i] - 与 max 函数返回的值完全相同”

标签: arrays algorithm max correctness


【解决方案1】:

当 n 为零时,我们得到 -infinity。当 n 为 1 或更高时,我们得到 max2( ans_(n-1), A[n-1])。所以归纳有效,除非 max2(-infinity, x) 返回 -无穷大,如果 A[n-1] = NaN 则可能。矛盾的步骤实际上表明该函数可能不是应有的严格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2017-10-28
    • 2013-02-07
    • 2021-11-21
    • 2013-01-23
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多