私は、不明なサイズのPerlでハッシュテーブルを作成しています。Perlでハッシュテーブルのサイズを予約することはできますか?
ハッシュテーブルは、文字列を配列への参照にマップします。
私のアプリケーションのメインループは、各反復でハッシュテーブルに5-10要素を追加します。ハッシュテーブルがいっぱいになると、物事は急速に減速し始める。観測から、ハッシュテーブルに〜50kのキーがある場合、キーを追加すると20倍の速度で減速します。
私は、ハッシュテーブルがいっぱいになって、衝突が発生していると仮定します。私はハッシュテーブルのサイズを '予約'したいと思っていますが、わかりません。
ハッシュはhNgramsToWordです。
各単語に対して、その単語の1-len-gramがキーとして追加され、そのngramを含む単語の配列を参照します。例えば
:
AddToNgramHash( "こんにちは")。
[H、E、L、L、O、彼、EL、ハロー、ello、地獄、LLO、HEL、LO、LL]はすべてのキーとして追加され、
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
私は正しいです。 :) –