我在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
我立场正确。 :) –