缓存遗忘数据结构背后的直觉是什么?

时间:2010-09-22 20:33:48

标签: language-agnostic cache-oblivious

我理解cache oblivious这个词的含义。但我想知道是否有任何简单的解释,如何设计数据结构,可以最佳地使用缓存,而不知道缓存的大小。

您能否提供这样的解释,最好是(简单)示例?

2 个答案:

答案 0 :(得分:7)

即使是像quicksort一样熟悉的算法也有点缓存(但不是最优的)。回想一下,它通过对数组进行分区,然后在分区的每一侧进行递归来工作。最终,它在一个适合缓存的子阵列上运行,因此在完成该子阵列并转移到另一个子阵列之前不会再有缓存未命中。那是我们正在寻找的财产。

将此与插入排序进行对比,插入排序(使用技术术语)始终在所有位置跳跃。因此,除了插入排序需要移动O(n ^ 2)个项目之外,在大型数组上使用时,它也会错过很多缓存。

然而,Quicksort距离最佳状态还有一段距离。每个单独的分区阶段都不会进行分割和递归 - 它会通过缓存缓存的内存进行长时间的顺序运行。在子阵列大小足够小以至于我们开始获胜之前,这可能会发生几次,因此我们不会最大限度地减少缓存未命中数。

答案 1 :(得分:3)

主要的直觉是,如果你递归地分割你使用的数据集,在某些时候(通常非常快),你将达到1)适合缓存的大小,2)填充至少一半的缓存(假设数据集的每个分割是(至少大约)一半)。