【问题标题】:Understanding invariants using Euclid's algorithimn使用欧几里得算法理解不变量
【发布时间】:2014-12-15 00:55:56
【问题描述】:

我在试图理解“不变”和“变体”这个词以及它与 c 编程的关系时遇到了问题。它在我的教科书中被大量使用,我的教授也经常提到它,但即使在阅读了其他关于堆栈溢出的回复后,我似乎也无法正确理解它。

这是我的教授提到的一个声明:

“Euclid 的 gcd 算法之所以有效,是因为它保持不变的 gcd(m, n) = gcd(n, r),其中 r = m mod n”

我认为这是提到的欧几里德 GCD 的简化伪代码:


gcd(m, n) = gcd(n, r)

  1. r = m % n
  2. m = n
  3. n = r

我对短语的不变部分感到困惑。来自维基百科的说法是,不变量是“在某个执行阶段始终为真的逻辑断言”。但老实说,我不太明白它们的意思。

为什么 gcd(m,n) = gcd(n,r) 被认为是不变量?有人能把这个短语变哑,让像我这样没有受过教育的人能理解为什么下面的例子是不变的吗?

是否有人可以提供任何简单的变体程序示例,以便我可以看到变体和不变量之间的区别?如有任何帮助,我将不胜感激。

【问题讨论】:

  • 我真的很好奇你的教授试图教你的“变体”的定义是什么;通常当我看到我认为“有人只是在寻找一种不同的做事方式”
  • 它们的意思是,在程序中的那个时刻,语句总是(“总是”)为真。
  • 感谢 Rici,这更有意义。我认为这是一时兴起的例子。我们并没有真正涵盖变体或不变量。

标签: algorithm invariants


【解决方案1】:

这已得到解答,但似乎并未解决不变性的真正含义。不变量是问题中不变的属性。

例如,考虑下面的谜题:有一个棋盘,斜对角的方格不见了。是否可以用多米诺骨牌(一对正方形,一个黑色和一个白色)来平铺棋盘。现在如果你看这个问题,你可以看到有一个固定的属性:当一个瓦片被移除时,会移除一个黑色和一个白色的方块。因此不变量是属性:黑色方块的数量==白色方块的数量。因此,我们可以得出结论,这个问题是无法解决的,因为对面的方格是相同的颜色,并且我们有一个经过修改的棋盘,黑棋和白棋的数量不相等。

所以基本上教授要做的是确定一个在问题的生命周期内不变的属性,然后使用它。

【讨论】:

    【解决方案2】:

    如果我们采用 Wikipedia 定义,不变式将是“当前数字对的 GCD 与原始数字对的 GCD 相同”。我们从一对到另一对的方式({m,n} -> {n,m%n})当然是算法的一部分,但与不变量并不真正相关。

    所以用这些术语可以描述算法:每次我们跳到一个更简单(较小数字)的问题,相同答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多