理解混淆算法表示法

时间:2017-10-03 14:18:28

标签: algorithm random language-agnostic

我无法理解书中用于描述prng测试算法的符号。以下是一些有问题的片段:

enter image description here enter image description here

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

继续:

enter image description here

enter image description here

我知道左箭头是分配。但同样,该算法指的是j,仅指j0j1。再次,它似乎是j的指数。但后来我特别对这条线感到困惑,&#34;然后对于j <- j, j1 - 1 ..., j0&#34;因为它似乎指的是递减j的索引,但它从j本身而不是下标中减去。

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

2 个答案:

答案 0 :(得分:3)

在我看来,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: ...

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

总结:你很困惑因为这本书令人困惑。不是你的错。我建议你找一本不那么令人困惑的书,如果你有更多的练习阅读数学期刊文章,也许可以回到这本书。

答案 1 :(得分:0)

fig = figure; plot(x1/length(y1)*end_of_data, y1, 'LineWidth',2, 'Color',Farbe1, 'DisplayName','First plot') hold on plot(x2/length(y2)*end_of_data, y2, 'LineWidth',2, 'Color',Farbe2, 'DisplayName','Second plot') plot(x3/length(y3)*end_of_data, y3, 'LineWidth',2, 'Color',Farbe3, 'DisplayName','Third plot') legend 是一个虚拟变量。当您为fig = plt.figure() ax = fig.add_subplot(111) # Plot some random data values = np.random.rand(4,1); graph_1, = ax.plot(values, label='original curve') # Keep track of x/y coordinates lines = [] xcoords = [] ycoords = [] def onclick(event): xcoords.append(event.xdata) ycoords.append(event.ydata) if len(xcoords)==2: lines.append(ax.plot(xcoords,ycoords,'.-')) xcoords[:] = [] ycoords[:] = [] # Refresh the plot fig.canvas.draw() cid = fig.canvas.mpl_connect('button_press_event', onclick) plt.show() 撰写j时,它会在A[j]j0 <= j <= j1之间的索引处用作占位符来表示A的所有元素。

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