我的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;
}
我想确认我的假设,即最近最少使用的行将全为零。它似乎有用,但我没有数学证明它让我满意。
所以,这是对的吗?或者我是否需要计算每行的最小汉明重量?
答案 0 :(得分:1)
你的假设是正确的。
我们可以通过矛盾来证明:
假设LRU候选者(具有最多零位的字节)是c并且在位置x中设置了位。
这意味着在行c之后没有使用行x,因此x必须具有c所具有的所有零位,加上位置x的零。这是一个矛盾,因为c是具有最多零位的字节,因此我们得出结论c不能设置任何位。