使用数组的时间和空间局部性



我对空间局部性和时间局部性的含义有点困惑。我希望通过看一个数组的例子,它将帮助我更好地理解它。

在这样的例子中:A[0][1], A[0][2], A[0][3]....等

这是否证明了时间局部性?我看到同一行被访问了很多次,但在不同的偏移量…这是否意味着访问了不同的地址?

同样,我说这样的例子是正确的吗:A[1], A[2], A[3]…等

展示空间局部性?

希望一些关于时间和空间局部性如何在实际代码中工作的澄清将帮助我更好地理解它们。

空间局部性和时间局部性描述了程序访问数据(或指令)的两种不同特征。维基百科有一篇很好的文章是关于参考的局部性的。

如果在时间上接近的引用序列在空间上也接近(邻近的内存地址,磁盘上邻近的扇区等),则称该引用序列具有spatial局部性。如果对同一事物的访问在时间上聚集在一起,我们就说一个序列具有temporal局部性。

如果程序访问大数组中的每个元素并读取它一次,然后移动到下一个元素,并且在触及每个其他位置之前不重复对任何给定位置的访问,那么这显然是空间局部性而不是时间局部性的情况。另一方面,如果程序在移动到另一个随机子集之前花费时间反复访问数组中位置的随机子集,则称其具有时间局部性,但不具有空间局部性。编写良好的程序将具有数据结构,这些数据结构将一起访问的内容分组在一起,从而确保空间局部性。如果程序很可能在访问A后不久访问B,则AB应该相邻分配。

你的第一个例子

A[0][1], A[0][2], A[0][3]

表示空间局部性,在时间上接近的事物在空间上也接近。它不显示时间局部性,因为您没有多次访问相同的内容。

第二个例子

A[1], A[2], A[3]

也显示空间局部性,但不显示时间局部性。

这里有一个例子显示时间局部性

A[1], A[2000], A[1], A[1], A[2000], A[30], A[30], A[2000], A[30], A[2000], A[30], A[4], A[4]

简单来说,

时间局部性:资源在一个点上被引用的概念In time将在不久的将来的某个时候再次被引用。

空间局部性:引用资源的可能性的概念如果附近的资源刚刚被引用,则更高。

来源:维基百科

下面是一个带有局部性的代码示例:

var sum = 0;
for (i = 0; i < n; i++){
  for(j=0; j < m ; j++){
    sum += a[i][j];
    }
}
return sum;
  • 存在时间局部性,因为sum在循环中被频繁访问。通过在缓存中保存最近使用的指令和数据值以及利用缓存层次结构来利用时间局部性。或者在寄存器中,而不是在内存中。

  • 存在空间局部性,因为我们有一个数组'a',我们按顺序访问数组的每个元素。空间局部性通常通过使用更大的缓存块和将预取机制(获取预期使用的项)纳入缓存控制逻辑来利用。

我断断续续地记不住它们之间的区别,尽管我记得这两种类型的位置。

空间位置记住"顺序"副词。

Temporal Locality要记住,在学习排序算法的开始时间,您看到要交换的"临时变量"。例如冒泡排序。它有两个循环,在那里交换像int temp = .....

您可以通过以下方式来识别哪个定义属于哪个定义。

时间局部性:时间局部性基于重复引用的资源。

空间局部性:空间局部性表示在不久的将来将请求与最近引用的数据相邻的数据。

时间局部性空间局部性的特例

最新更新