了解令人困惑的算法表示法

Understanding confusing algorithm notation

提问人:Davigor 提问时间:10/3/2017 最后编辑:Davigor 更新时间:10/4/2017 访问量:169

问:

我很难理解一本书在描述 prng 测试算法时使用的符号。以下是一些有问题的片段:

enter image description here enter image description here

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

继续:

enter image description here

enter image description here

我知道左箭头是赋值。但同样,该算法引用了并且仅引用了 和 。同样,它似乎是 j 的索引。但是,我对“Then for”这一行感到特别困惑,因为它似乎指的是递增索引,但它是从自身而不是下标中减去的。jj0j1j <- j, j1 - 1 ..., j0jj

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

算法 随机 语言无关

评论

0赞 Eugene Sh. 10/3/2017
它 sais 正在获得 , ...顺序。就像一个从下到下的循环。jj1j1-1j0j1j0

答:

0赞 user1196549 10/3/2017 #1

j是一个虚拟变量。当你写 for 时,它作为一个占位符来表示 at 索引的所有元素 和 之间。A[j]j0 <= j <= j1Aj0j1

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

评论

0赞 Davigor 10/4/2017
我会回应我向另一位评论者提出的问题:什么是和?难道只是说这是最大的指数和最小的指数吗?那么如何在初始化步骤中协调线路呢?j0j1j1jj0j0 <- j1 <- 1
0赞 10/4/2017
@Davigor:手动执行算法,从合理大小的数据集开始。
3赞 zwol 10/3/2017 #2

在我看来,这里有多种独立的用途。这是数学家写的典型的CS文本,他们可能会惊讶地发现,他们对他们的符号往往非常草率,期望读者从隐含和上下文中瞥见各种各样的东西。j

在第一段中,作者用来指代一个由 20 个元素组成的向量数组中的任意元素(j 确实从零开始)。他们正在定义如何从一维随机数流填充这个固定宽度的向量数组(您可能会发现将其视为二维数组更舒服)。如果我显式写出数组的前两行,也许会有所帮助?V[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: ...

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

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

评论

0赞 Davigor 10/3/2017
这很有帮助,谢谢。我仍然不完全确定 和 的意义。难道只是说这是最大的指数和最小的指数吗?j0j1j1jj0
0赞 zwol 10/4/2017
看起来,在外循环的每次迭代中(“正好执行步骤 S2 n-1 次”),内循环将 j 循环遍及从 j1 到 j0 的所有值(包括 j1),然后在下一次迭代中更改 j1 和 j0 之一。由于内部循环包括两个端点,并且 j1 和 j0 不等,因此它们开始相等是可以的。也许我最终会尝试将其转换为伪代码......午饭后。:-)(还有一件事:你说“递减 j 的索引”,但 j 在这里不是索引变量(数组)。 j、j0 和 j1 是三个独立的标量变量。
0赞 Davigor 10/4/2017
编辑了我的帖子以添加第 3 步,以防您好奇,但您已经提供了很多帮助。谢谢!