代码之家  ›  专栏  ›  技术社区  ›  Dustman

什么是不变量?

  •  92
  • Dustman  · 技术社区  · 16 年前

    这个词似乎在许多上下文中被使用。我能想到的最好的一点是,它们是指一个不能改变的变量。那不是什么常量/决赛吗?是为了什么?

    9 回复  |  直到 6 年前
        1
  •  133
  •   Jacob Baskin    16 年前

    不变量比变量更具有“概念性”。一般来说,它是程序状态的一个属性,总是正确的。一种确保不变量保持不变的函数或方法,称为保持不变量。

    例如,一个二进制搜索树可能具有不变量,即对于每个节点,节点的左子节点的键小于节点自己的键。为这棵树正确编写的插入函数将保持不变。

    正如你所说,这不是你可以存储在变量中的那种东西:它更像是一个语句。 关于 程序。通过弄清楚程序应该维护什么样的不变量,然后检查代码以确保它确实维护了这些不变量,可以避免代码中的逻辑错误。

        2
  •  21
  •   moonshadow    16 年前

    这是一个你知道在逻辑的某个特定位置总是正确的条件,并且可以检查什么时候调试来找出哪里出了问题。

        3
  •  12
  •   shsteimer    16 年前

    我通常更多地从算法或结构的角度来看待它们。

    例如,您可以有一个可以断言的循环不变量——在每次迭代的开始或结束时始终为真。也就是说,如果循环要处理从一个堆栈到另一个堆栈的对象集合,那么可以在循环的顶部或底部说stack1+stack2=c。

    如果不变量检查失败,则表明出现了问题。在本例中,这可能意味着您忘记将已处理的元素推送到最终堆栈上,等等。

        4
  •  12
  •   Shog9    16 年前

    维基百科的魔力: Invariant (computer science)

    在计算机科学中,一种谓词, 如果为真,则在整个 具体的操作顺序,是 调用(一个)不变的 序列。

        5
  •  3
  •   Chris    16 年前

    在一个代码块内不改变的东西

        6
  •  3
  •   void    7 年前

    正如此行所述:

    在计算机科学中,一个谓词,如果为真,在整个特定的操作序列中将保持为真,称为对该序列不变。

    为了更好地理解这个希望,这个例子在C++中有帮助。

    考虑一个场景,您必须获取一些值,并在一个名为as的变量中获取它们的总计数 count 并将它们添加到一个名为 sum

    这个 不变量 (这更像是一个概念):

    // invariant:
    // we have read count grades so far, and
    // sum is the sum of the first count grades
    

    上面的代码是这样的,

    int count=0;
    double sum=0,x=0;
    while (cin >> x) {
    ++count;
    sum+=x;
    }
    

    上面的代码是什么?

    1)从 cin 把它们放进去 x

    2)成功读取一次后,递增 计数 sum = sum + x

    3)重复1-2直到读取停止(即,ctrl+d)

    循环不变量:

    不变量必须为真 总是 . 所以最初你用这个开始你的代码

    while(cin>>x){
      }
    

    这个循环从标准输入中读取数据,并存储在x.well和good中。但是 不变量 因为我们的第一部分 不变量 没有被跟踪(或保持真实)。

    // we have read count grades so far, and
    

    如何保持不变?

    简单!递增计数。

    所以 ++count; 会好的!现在我们的代码变成了这样,

    while(cin>>x){
     ++count; 
     }
    

    但是

    即使现在我们 不变量 (一个必须是正确的概念)是错误的,因为现在我们不满足 我们的 不变量。

    // sum is the sum of the first count grades
    

    那么现在该怎么办呢?

    添加 X 总和 并将其存储在 总和 ( sum+=x )下一次呢 cin>>x 将在X中读取新值。

    现在我们的代码变成了这样,

    while(cin>>x){
     ++count; 
     sum+=x;
     }
    

    让我们检查一下

    代码是否与我们的不变量匹配

    / /不变量:
    //到目前为止,我们已经阅读了count个分数,并且
    //sum是第一个计数分数的和
    

    代码:

    同时(cin>>x){
    +计数;
    求和+=x;
    }
    

    啊!循环不变量为真。 总是 代码也很好用。

    上面的例子是 采取和修改自 加速C++ 作者:安德鲁·科宁和芭芭拉-E

        7
  •  2
  •   Kaushik    16 年前

    接下来,不变量在编写干净的代码时非常有用,因为从概念上知道什么不变量应该存在。 在里面 您的代码允许您轻松地决定如何组织代码以实现这些目标。如前所述,它们在调试中也很有用,因为检查是否维护不变量通常是一种很好的方法,可以查看您试图执行的任何操作是否实际执行了您想要的操作。

        8
  •  1
  •   meshal almotairi    12 年前

    ADT不变的特殊关系 在数据字段中(实例变量) 在这之前和之后一定是这样 任何实例方法的执行。

        9
  •  1
  •   HassanTC    6 年前

    它通常是一个在某些数学运算中不会改变的量。 安 例子 是一个标量,在旋转下不会改变。例如,在磁共振成像中,用旋转不变量来描述组织特性是有用的,因为在理想情况下,它的估计并不取决于扫描仪中物体的方位。

    推荐文章