MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)

现代计算机存储层次模型

MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第1张图片
- 现代计算机有多级缓存的机制,越靠近CPU的缓存容量越小,速度越快。
这样设计的原因,一方面是靠近CPU的缓存制作成本高,价格昂贵,另一方面是极限速度受电荷传导速度限制,存储容量做大必定会降低存取速度。
- Cost to access=latency+amount/bandwidth
可知在存储层次上越远离CPU延迟(latency)越长,计算机不同层次的带宽(bandwidth)是相同的,可以随着延迟的增长,增大不同层次的每次读取的数据量(amount),这样读取每个元素的平摊代价就减小了。
- Amortized cost to access one element=latency/amount+1/bandwidth

存取数据的局部性

空间局部性(spatial locality):
    算法倾向于使用同一块中的数据。
时间局部性(temporal locality):
    理想情况下,算法能多次重用同一个数据块。

两层存储结构模型:

MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第2张图片

  • 假设块(block)的容量为B,cache的容量为M,所以cache中有M/B个块,这里假设主存的容量足够大。
  • 例如CPU要使用A[i],它如果在cache中,则可直接获取到,可忽略代价,否则就要将主存中包含A[i]的一整块数据读取到cache中,如果cache已满的话,还需要清理出一部分内容,将其内容写回主存。
  • 模型假设:
    1.存取cache中的数据可忽略代价,但这部分还要像之前那样考虑CPU的计算量。
    2.定义算法存储数据的传输量MT(N)(用在两层中传输的块数衡量),使用符号MT(N)用来表示算法数据规模为N时的数据传输量,更准确的说是MTB,M(N),因为此值还依赖于模型中的参数B和M。
    • 利用缓存的参数的算法被称为缓存敏感算法,例如B-Tree是缓存敏感的数据结构,相关的算法是缓存敏感的算法。

缓存无关算法

  • 设计算法时,并不知道上述模型中B和M的值,但对于所有可能的值都能将尽量做到高效,这样的算法是比较好的缓存无关算法。
  • 模型本身可以保证当访问一个不在cache中的元素时,系统会将包含此元素的块调入cache中,每次这样的调入操作会考虑在算法的数据传输量MT(N)中。
  • 当cache中容量已满,假设系统采取最理想的置换策略,将最久会使用的块调出cache。

主存的数据块

  • 计算机中的数据在主存中都是线性存储的。
    MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第3张图片
  • 主存中的数据会存储在一个类似一维数组的空间中,如果访问上图中加点位置的元素,系统会将它所在的块调入cache,另外在分析中需要注意的是如果在内存中分配了一个数组的空间,它很有可能是没有对齐到某个块的边缘。

定理

如果一个缓存无关算法在两层的模型中是高效的,那么它在一个L层(多层)的模型中同样会是高效的。

数组扫描

  • 算法伪码:
Scanning(A,N)
    for i ← 1 to N
        do visit A[i]

数组扫描
- 扫描内存中连续的N个元素。
存储传输量MT(N)=O(N/B+1)

翻转数组

  • 算法伪码:
Reserve(A,N)
    for i ← 1 to [N/2]
        do exchange A[i] ←→ A[N-i+1]

MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第4张图片

  • 在访问内存方面可以看成两次扫描,一次从数组头至数组尾,另一次从数组尾至数组头。
    可以假设cache中可以存储的块的数量M/B不少于两个,存储传输量MT(N)=O(N/B+1)。

二分搜索

MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第5张图片

  • 存储传输量MT(N)=O(lg(N/B)+1)=O(lgN-lgB+1)
  • 二分查找需要O(lgN)次的访问数据,当访问的数据在一个块大小的范围内时就不会再增加存储传输量了,只需将此块调入一次,此后的访问就是在cache中的了,代价可以忽略不计,所以得到上述结果。
  • 因为B的大小非常有限,这样的数据传输量优化程度还是比较低的。

缓存与分治法

算法会递归降低问题的规模,直至O(1)操作内就可以完成。
考虑问题规模降低到cache的大小M或数据块的大小B的时刻,以此分析存储传输量。

顺序统计

  • 算法描述:
1.将数组分为N/5段。
2.求出5个元素的中位数。
3.用步骤12递归的处理步骤2求出的中位数组成的数组,求得最中间的数x。
4.用x划分数组(小于的在一侧,大于的在另一侧)。
5.用步骤1234可以递归的处理划分后的左侧或右侧数组。
  • 存储传输量:
    MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第6张图片

矩阵乘法

  • 朴素算法:
    MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第7张图片
  • 矩阵分块算法:
    MIT算法导论公开课之第22课 高级课题、缓存参数无关算法(一)_第8张图片

你可能感兴趣的:(算法导论公开课笔记)