我遇到了一个我无法实现的伪代码,因为我无法理解它:
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。
答案 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程序概念化为更接近硬件的东西(所有东西都在运行并且并行测试)。祝你好运