在LRU square算法中,最近最少使用的行总是为零?

时间:2013-11-21 20:58:37

标签: c algorithm lru

我的Hacker's Delight副本在家,我发现的网络资源在这个细节上并不清楚。

我使用众所周知的“行列方形”算法编写了以下8级LRU。 (有更好的名字吗?)。

#include <stdint.h>

typedef union {
  uint8_t rows[8];  
  uint64_t cols;
} lru_state;

void lru_init(lru_state *this) {
  this->cols=0;
}

void lru_up(lru_state *this, int used /* in 0..7 */) {
  this->rows[used]=0xff;
  this->cols &= ~(0x0101010101010101 << used);
}

int lru_get(lru_state *this) {
  int i;
  for (i=1; i<8 ; i++) {
    if (0==(this->rows[i])) return i;
  }
  return 0;
}

我想确认我的假设,即最近最少使用的行将全为零。它似乎有用,但我没有数学证明它让我满意。

所以,这是对的吗?或者我是否需要计算每行的最小汉明重量?

1 个答案:

答案 0 :(得分:1)

你的假设是正确的。

我们可以通过矛盾来证明:

假设LRU候选者(具有最多零位的字节)是c并且在位置x中设置了位。

这意味着在行c之后没有使用行x,因此x必须具有c所具有的所有零位,加上位置x的零。这是一个矛盾,因为c是具有最多零位的字节,因此我们得出结论c不能设置任何位。