我正在为期末考试而学习,我们的教授给了我们一些练习以及答案。可以肯定他的解决方案在这里是错误的...有人可以确认/拒绝吗?
提供的问题:我们可以并行执行以下循环吗?如果是,请执行此操作。如果没有,为什么不呢?
a[0] = 0;
for( i = 1; i < n; i++)
a[i] = a[i-1] + i;
(教授)提供的答案:是的,如果我们意识到这一点,我们可以做到:
a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i
(我)我的理由:如果按照输出进行操作,这似乎不成立:
a[0] = 0
a[1] = 0 + 1
a[2] = 1 + 2 = 3
... etc ...
我是正确的,我的教授错了吗?还是我疯了?
答案 0 :(得分:0)
您的教授可能将'i'与循环外的另一个变量混淆了。
它适用于:
j = ...;
a[0] = 0;
for( i = 1; i < n; i++)
a[i] = a[i-1] + j;
也就是说,您可以找到a[i]=a[i-1]+i
的封闭公式,但是其中涉及的数学更多。在这种情况下,它是:
a[i] = (i^2+i)/2;
通常,它会变得更加复杂,例如斐波那契数列的封闭公式:
答案 1 :(得分:0)
Whomever提供了以下答案:
a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i
是错误的,因为替换不能那样工作。
所讨论的循环是最简单的示例,可以在其中找到流相关性(也称为“真实”相关性):a[i]
始终在读取之前写入,因此存在“写入后读取”的危险”。流相关性强加非对称排序。