我的算法教科书作者:By Robert Sedgewick和Kevin Wayne说这个for循环有3N数组访问,而在其他地方我发现在一些幻灯片中这个循环的相同代码声称它的5N。它看起来像4N因为a [i]被使用了两次。
它是什么,为什么会这样?
算法中的第三个循环
// Distribute the records.
for (int i = 0; i < N; i++)
aux[count[a[i].key()]++] = a[i];
链接到sedgewick的文章。 http://www.informit.com/articles/article.aspx?p=2180073
链接到allegheny大学的课程幻灯片。 http://cs.allegheny.edu/sites/jwenskovitch/teaching/CMPSC250/docs/lectures/14%20String%20Sorts.pdf
链接到过去的堆栈溢出。 What constitutes 'array access' in the context of algorithms?
答案 0 :(得分:1)
a [i]加载两次,+ 2。 count [...]递增一次,这意味着加载和存储,+ 2。 aux [...]被写一次,这意味着一个商店,+ 1。
2 + 2 + 1 = 5
我会说它是5N,但通过在变量中缓存[i]可以轻松优化到4N。如果我们将增量计为单个访问,则可以将4N优化为3N。 AFAIK,关于增加数组的单元是单访问还是两次访问,没有普遍的约定。
现代CPU通常不关心数组。统一处理所有内存。提供对内存有效的常规(原子)增量操作。我自己会说4N,但可能与OP不同。