【问题标题】:Will this algorithm terminate?这个算法会终止吗?
【发布时间】:2012-03-02 19:13:51
【问题描述】:

如果集合中有不同的值,这个算法(伪代码)会终止吗?

while (curElement != average(allElements))
{
    curElement = average(allElements);
    nextElement();
}

请注意,如果我们在数组的末尾,我假设我们将从头开始。

【问题讨论】:

  • nextElement() 是做什么的,allElements() 集合常量是什么?
  • 你是如何计算的average(allElements)
  • 这取决于您在该集合中的值。 average(allElements) 将返回小数值还是绝对值?
  • @RoyDictus:应该是伪代码。想象一下 nextElement() 将指针 curElement 移动到集合的下一个元素,或者如果我们在末尾,则移动到开头。
  • @RoyDictus:哦,设置 curElement 时 allElements 会发生变化。

标签: algorithm language-agnostic infinite-loop halting-problem


【解决方案1】:

由于这是伪代码,一个包含 2 个元素的简单示例将揭示存在程序不会终止的情况:

x = 0, y = 1;

          x     y
Step 1:   0.5   1
Step 2:   0.5   0.75
Step 3:   0.635 0.75
//and so one

涉及到一些数学问题,lim(x-y) = lim( 1 / 2^n )

所以数字会收敛,但它们永远不会相等。

但是,如果您实际在计算机上实现此功能,由于硬件限制,它们将变得相等 - 并非所有数字都可以用有限的位数表示。

【讨论】:

  • 存在任意精度的实数实现,这将允许现实生活中的实现永远运行。
  • @bdares 我对此表示怀疑。他们仍然将数字存储在内存中,并且只要它变大,它就不是无限的。
  • @LuchianGrigore:您可以将数字存储在磁盘/远程集群中并即时扩展。理论上是可以做到的。
  • 嗯...好点。 @amit 任何现实生活中的存储都是有限的,所以他的论点仍然成立。
  • @bdares:(1)您可以动态扩展集群,因此它是无限的。 (2) 你可以说宇宙会在某个时间点坍缩,宇宙中的原子数量是有限的,所以任何算法的每个实现都是O(1)时空。但我认为这不是讨论的内容。
【解决方案2】:

视情况而定。

如果您的元素包含离散值,那么它们很可能会在运行几次后落入相同的值。

如果您的元素具有有限的精度值(例如浮点数或双精度值),则需要更长的时间,但时间有限。

如果您的元素具有任意精度值,那么您的算法可能永远无法完成。 (如果你把积分的每一部分都数出来,然后把它加到一张纸上的数字上,你需要无限的时间、无限大的纸,以及对这个类比的无限耐心。)

您的代码与以下代码几乎没有区别:

var i = 1;
while (i != 0) 
    i = i / 2;

它会终止吗?这真的取决于实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 2016-08-28
    • 2015-08-11
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多