注:我試圖找到具體的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