【问题标题】:Understanding confusing algorithm notation理解令人困惑的算法符号
【发布时间】:2017-10-03 14:18:28
【问题描述】:

我无法理解一本书在描述 prng 测试算法时使用的符号。以下是一些有问题的 sn-ps:

我的困惑是:j 的意义是什么?它根本没有很好的定义。它应该是向量的索引吗?那怎么不从0开始呢?

继续:

我知道左箭头是赋值。但同样,该算法指的是j,并且只指j0j1。同样,它似乎是 j 的索引。但后来我对“那么对于j <- j, j1 - 1 ..., j0”这一行特别感到困惑,因为它似乎是指减少j 的索引,但它是从j 本身而不是下标中减去。

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 据说j 依次获取j1j1-1...j0 的值。就像从j1j0 的循环一样。

标签: algorithm random language-agnostic


【解决方案1】:

在我看来,j 在这里有多种独立用途。这是典型的由数学家撰写的 CS 文本,他们 - 你可能会惊讶地发现 - 通常对他们的符号非常草率,期望读者从暗示和上下文中看到所有种类的东西.

在第一段中,作者使用V[j] 来引用数组的任意元素20 元素向量(并且j 确实从零开始) .他们正在定义如何从一维随机数流中填充这个固定宽度向量数组(您可能会觉得将其视为一个二维数组更舒服)。如果我明确地写出数组的前两行,也许会有所帮助?

V0 = (Y0, Y1, Y2, ... Y19)
V1 = (Y20, Y21, Y22, ... Y39)
   ⋮
Vj = (Y[j*20], Y[j*20+1], ... Y[j*20+19])

在第二段中,A[j] 又是一个数组的任意元素,但它是一个不同的、不相关的浮点数数组。

在第三和第四段中,jj0j1 似乎是三个独立的索引变量,而将算法塞进散文中会使情况更加混乱。作者应该使用伪代码并选择更好的变量名。这是一个产生伪代码版本的尝试——不过,我故意保留了错误的变量名,所以你可以看到对应关系。

Algorithm_S (m, n):
    # S1: Initialize.
    var A: float[n+1]
    var j, j0, j1: int

    for j in 0, 1, ..., n:
        A[j] ← 0
    A[1] ← 1

    # S2: Update probabilities.
    j0 ← 1
    j1 ← 1
    repeat n-1 times:
        j1 ← j1 + 1
        for j in j1, j1 - 1, ..., j0:
            A[j] ← (j/m)*A[j] + (1 + 1/m - j/m)*A[j-1]
            if A[j] < 1e-20:
                A[j] ← 0
                if j = j1: j1 ← j1 - 1
                if j = j0: j0 ← j0 + 1

    # S3: ...

我不确定这是不是正确的,因为即使像这样打开它,它对我来说也没有多大意义。问题可能是你只引用了算法的前两个步骤,所以我不知道这个“辅助概率数组”将用于什么,我不知道代码是否应该应该 做它正在做的事情。不用担心。

总之:你很困惑,因为这本书很混乱。不是你的错。我建议你找一本不那么令人困惑的书,当你有更多的阅读数学期刊文章的练习后,也许再回到这本书。

【讨论】:

  • 这有帮助,谢谢。我仍然不完全确定j0j1 的重要性。难道只是说j1jj0最小的索引最大?
  • 看起来,在外循环的每次迭代中(“执行步骤 S2 恰好 n-1 次”),内循环在从 j1 到 j0 的所有值上循环 j,包括在内,然后为下一次迭代更改 j1 和 j0 之一。因为内部循环包括两个端点,并且因为 j1 和 j0 不保持相等,所以它们开始相等是可以的。也许我会尝试将它转换为伪代码毕竟......午饭后。 :-) (还有一件事:你说“减少 j 的索引”,但这里 j 不是索引变量(数组)。j、j0 和 j1 是三个独立的标量变量。)
  • 编辑了我的帖子以添加第三步,以防您好奇,但您已经提供了很多帮助。谢谢!
【解决方案2】:

j 是一个虚拟变量。当您将A[j] 写成j0 &lt;= j &lt;= j1 时,它充当占位符,表示Aj0j1 之间的索引处的所有元素。

当您对算法进行编程时,您可能会声明一个或多个循环变量来反映这一点。

【讨论】:

  • 我会回应我向其他评论者提出的问题:j0j1 是什么?难道只是说j1j的最大索引和j0最小的索引吗?那么初始化步骤中j0 &lt;- j1 &lt;- 1这行怎么调和呢?
  • @Davigor:手动执行算法,从合理大小的数据集开始。
猜你喜欢
  • 1970-01-01
  • 2013-10-18
  • 2022-11-22
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多