我在Perl中創建了一個未知大小的哈希表。是否可以在Perl中保留哈希表的大小?
散列表將字符串映射到對數組的引用。
我的應用程序的主循環在每次迭代中向散列表添加5-10個元素。隨着哈希表填滿,事情開始大幅放緩。從觀察結果來看,當散列表中有〜50k個密鑰時,加入密鑰的速度會減慢20倍。
我假設散列表已滿,並且發生了衝突。我想'保留'哈希表的大小,但我不確定如何。
問題中的散列是hNgramsToWord。
對於每個單詞,該單詞的1-len-grams被添加爲鍵,並引用包含該ngram的單詞數組。
例如:
AddToNgramHash(「Hello」);
並[h,E,L,L,O,他,EL,LL,LO,HEL,LLO,地獄,ELLO,你好]都被添加作爲密鑰,映射到 「你好」
sub AddToNgramHash($) {
my $word = shift;
my @aNgrams = MakeNgrams($word);
foreach my $ngram (@aNgrams) {
my @aWords;
if(defined($hNgramsToWord{$ngram})) {
@aWords = @{$hNgramsToWord{$ngram}};
}
push (@aWords, $word);
$hNgramsToWord{$ngram} = \@aWords;
}
return scalar keys %hNgramsToWord;
}
sub MakeNgrams($) {
my $word = shift;
my $len = length($word);
my @aNgrams;
for(1..$len) {
my $ngs = $_;
for(0..$len-$ngs) {
my $ngram = substr($word, $_, $ngs);
push (@aNgrams, $ngram);
}
}
return @aNgrams;
}
我的猜測是perl根本就不是用這樣的東西做的(這是很多鍵)。就我所知,在這種實現中沒有任何低級別的訪問。 –
@crimson_penguin:不正確,反正50k不是很多密鑰 – ysth
我立場正確。 :) –