課題

線形探索を用いたHashを実装してみた。わざわざ効率の悪い実装をするなんて、なんという無駄な作業だ・・・
とりあえず5分くらいでPerlを使ってLinearProbingHashを実装した。っていうか、Perlの場合は、標準でもっと効率のいいHashを持ってるのに、それを無視してこういうことをする。

package LinearProbingHash;

sub search{
    my $this = shift;
    my $key = shift;
    foreach(keys %{$this->{_data}}){
        $this->{_count}++;
        if($_ eq $key){
            last;#終了
        }
    }
    return $this->{_data}->{$key};
}

コンストラクタとかは省略。keys %{$this->{_data}}というのがミソで、わざわざ線形探索を行うための工夫である。普段からこんなスクリプト書くやつがいたら、俺は殴る。
とりあえず、線形探索を使って行った場合の比較回数の理論値を出そう。
調べるkeyが、Hashの中に存在している場合は、nをHashのサイズとすればn/2である。また、Hashの中に存在していない場合はnである。従って、Hashの中に存在している確率をpと置くと、p(n/2) + (1-p)nである。一応計算すると、n(1-p/2)が期待値となる。
分散も調べてみよう・・・と思ったが、面倒なのでプログラムに計算させることにする。


my $e = $n * (1 - $p /2);
my $v = 0;
for($i = 1; $i <= $n; $i++){
    $v += ( ($e - $i) * ($e - $i) ) / ($n * $p);
}
$v += ( ($p * $n / 2) * ($p * $n / 2) ) * (1 - $p);

で、完成したわけですが、それは公開しません。