ハッシュ法の実装
ハッシュ法
ハッシュ法は、検索アルゴリズムの一つで、各要素の値に応じて格納場所を管理するハッシュテーブルを用いて、データの検索を高速化する。ハッシュテーブルはキーを持つデータの集合に対して、動的な挿入、検索、削除を効率的に行うことができるデータ構造の1つである。
ハッシュテーブル
ハッシュテーブルはm個の要素を格納できる配列Tと、データのキーから配列の添字を決定する関数から構成されている。つまり、各データを挿入すべき位置をそのデータのキーを入力とした関数で求める。
衝突
ハッシュ法で不特定多数のデータを扱う場合、異なるデータでも同じハッシュ値が生成される可能性がある。これをハッシュ値の「衝突 (collision) 」呼ぶ。
use strict; use warnings; use utf8; use Time::HiRes qw(gettimeofday tv_interval); binmode(STDOUT, ":utf8"); use Data::Dumper; &hash_algorithm; sub hash_algorithm { my $t0 = [gettimeofday]; print "命令の数を表す数値nを入力してください。\n"; my $input_n = <STDIN>; print "n件の命令を入力してください。\n"; my %input_orders_hash; my @result_arr; while (my $input_n_order = <STDIN>) { last if $input_n_order eq "end\n"; chomp($input_n_order); my @tmp = split(/ /, $input_n_order); if ($tmp[0] eq 'insert') { $input_orders_hash{"$tmp[1]"} = $tmp[1]; } if ($tmp[0] eq 'find') { if ($input_orders_hash{"$tmp[1]"}) { push (@result_arr, 'yes'); } else { push (@result_arr, 'no'); } } } $\="\n"; foreach my $result_value (@result_arr) { print $result_value; } my $timer = tv_interval($t0)."\n"; print "$timer ms\n"; }
上記のコードは、ハッシュを使っているけれどハッシュテーブルを再現できていないよね。スクリプト言語でも再現できるのだろうか。