提问人:Davigor 提问时间:10/3/2017 最后编辑:Davigor 更新时间:10/4/2017 访问量:169
了解令人困惑的算法表示法
Understanding confusing algorithm notation
问:
我很难理解一本书在描述 prng 测试算法时使用的符号。以下是一些有问题的片段:
我的困惑是:的意义是什么?它根本没有很好的定义。它应该是向量的索引吗?那怎么不从 0 开始呢?j
继续:
我知道左箭头是赋值。但同样,该算法引用了并且仅引用了 和 。同样,它似乎是 j 的索引。但是,我对“Then for”这一行感到特别困惑,因为它似乎指的是递增索引,但它是从自身而不是下标中减去的。j
j0
j1
j <- j, j1 - 1 ..., j0
j
j
非常感谢任何帮助,谢谢。
答:
j
是一个虚拟变量。当你写 for 时,它作为一个占位符来表示 at 索引的所有元素 和 之间。A[j]
j0 <= j <= j1
A
j0
j1
当您对算法进行编程时,您可能会声明一个或多个循环变量来反映这一点。
评论
j0
j1
j1
j
j0
j0 <- j1 <- 1
在我看来,这里有多种独立的用途。这是数学家写的典型的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]
在第三段和第四段中,、、和似乎是三个独立的索引变量,通过将算法塞进散文中,情况变得更加混乱。作者应该使用伪代码并选择更好的变量名称。这里是生成伪代码版本的尝试 - 不过,我故意保留了错误的变量名称,以便您可以看到对应关系。j
j0
j1
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: ...
我不确定这是否正确,因为即使这样打开它,它对我来说也没有多大意义。问题可能在于你只引用了算法的前两个步骤,所以我不知道这个“辅助概率数组”将用于什么,我无法判断代码是否应该做它正在做的事情。别担心。
总而言之:你很困惑,因为这本书很混乱。这不是你的错。我建议你找一本不那么令人困惑的书,也许当你在阅读数学期刊文章时有更多的练习时再来读这本书。
评论
j0
j1
j1
j
j0
上一个:如何洗牌八个项目以接近最大熵?
下一个:将任务信息存储在数据库中
评论
j
j1
j1-1
j0
j1
j0