无法实现伪代码

时间:2012-06-19 06:09:48

标签: pseudocode

我遇到了一个我无法实现的伪代码,因为我无法理解它:

i, c := 0,0;
do i ≠ n →
    if v = b[i]           → c, i := c + 2, i + 1
       c = i               → c, i, v := c + 2, i + 1, b[i]
       c ≠ i ^ v ≠ b[i]    → i := i + 1
    fi
od

我认为tis伪代码是关于在b []中找到超过 n / 2次的值v。

2 个答案:

答案 0 :(得分:3)

if中的三个条件是替代方案,它们应转换为if-else if-else链。 类似于作业的语句c,i,v := c+2, i+1, b[i]是多项作业,据我所知,就像Python多重作业一样,i中的b[i]指的是i的旧值。产量

// n and v are initialised to something sensible, hopefully
i = 0;
c = 0;
while(i != n) {
    if (b[i] == v) {
        c = c + 2;
        i = i + 1;
    } else if (c == i) {
        c = c + 2;
        v = b[i];  // conjecture that the b[i] on the RHS refers to the old i
        i = i + 1;
    } else {
        i = i + 1;
    }
}

由于i在每个分支中递增,我们可以解除它,并获得

for(i = 0, c = 0; i != n; ++i) {
    if (b[i] == v) {
        c += 2;
    } else if (c == i) {
        c += 2;
        v = b[i];
    }
}

答案 1 :(得分:0)

哇,这不是我所期待的。它看起来像Dijkstra的标记符号(不确定什么是一个很好的参考,也许这个:http://www.cs.grinnell.edu/~stone/courses/compilers/introduction-to-Dijkstra.pdf)。

大致上这是一系列有保障的检查。如果某些条件成立,则执行暗示。至于用do-od表示法实现某些东西,我不太确定。有点像:

i = c = 0;
while (i != n) {
    if (v == b[i]) {
        c = c+2, i = i+1;
        if (c == i) c = c+2, i = i + 1, v = b[i];
        if (c != i || v != b[i]) i = i + 1
    }
}

不知道那些中间变量是什么,并且我总是将do-od程序概念化为更接近硬件的东西(所有东西都在运行并且并行测试)。祝你好运