注:我试图找到具体的LRU算法的名称,而不是这是一个缓存算法(我知道这是我写的)。告诉我这是一个缓存算法,就像告诉某人正在寻找名称为红黑树的人,这是一个树平衡算法。这个算法的名字是什么?
我最近创建了以下算法,但我相当肯定某人必须在我之前完成此操作,并给它一个名称。这对任何人都很熟悉吗?
目的:保持一个固定大小的字符串池和它们被看到的次数。如果池超出最大尺寸,则只保留最近使用的项目。
伪代码:
var cur
var old
func add_key(key)
if cur not defined
put a hash in cur
if key in old
copy value from old to cur for this key
delete key from old
increment cur[key]
if there are too many keys in cur
replace old with cur
empty cur
copy value from old to cur for this key
delete key from old
return cur[key]
Perl 5中的简单的实现是这样的:
#!/usr/bin/perl
use strict;
use warnings;
{ package Fixed::LRU::Counter;
sub new {
my ($class, $max) = @_;
return bless {
max => $max,
cur => {},
old => {},
}, $class;
}
sub add_key {
my ($self, $k) = @_;
if ($self->{old}{$k}) {
$self->{cur}{$k} = $self->{old}{$k};
delete $self->{old}{$k};
}
$self->{cur}{$k}++;
if (keys %{$self->{cur}} > $self->{max}) {
$self->{old} = $self->{cur};
$self->{cur} = { $k => $self->{old}{$k} };
delete $self->{old}{$k};
}
return $self->{cur}{$k};
}
}
my $c = Fixed::LRU::Counter->new(3);
for my $k (qw/a a b c d e f f g a f/) {
print "$k: ", $c->add_key($k), "\n";
}
您正在跟踪项目被查看的次数,但它对您的缓存算法没有任何影响(例如:它看起来根本没有用于确定某个项目被驱逐或不)。这是红鲱鱼吗? – mhum 2011-03-26 00:41:09
@mhum它实际上记录了我们看到这些项目的频率(这是我们真正关心的),但可能有无数项目,所以我们只想跟踪我们最近看到的项目。 – 2011-03-26 13:35:59
@Chas。欧文斯:虽然你可能在其他地方使用它,但我看不到你在缓存算法中实际使用它的方式。例如,如果删除了“$ self - > {cur} {$ k} ++”这一行,那么add_key()会有什么不同?虽然add_key()的返回值将毫无意义,但cur和old缓冲区的内容将保持不变,是不是?或者我误解了你的实现? – mhum 2011-03-26 19:38:31