##はしめに
今回はこちらの本でアルゴリズムの勉強をしているので学んだハッシュ探索法をRubyで書いて見ました。
アルゴリズムをはじめよう
##ハッシュ探索法とは
データを探す探索アルゴリズムの一つ。予めデータを違う配列を作成して格納。格納した配列からデータを探索する方法。
##実装
与えられた配列をデータ格納用の配列に格納するメゾットとデータ格納用の配列から目的の値を探し出すメゾットの二つを作成します。
#与えられた配列をデータ格納用の配列へ格納
def hash_storage(arrayd)
#データ格納用の配列を元の2倍の要素を初期値0で作成
arrayh =Array.new(arrayd.count*2,0)
#ハッシュ計算用
x = arrayh.count
#繰り返し数を初期化
i = 0
#元の配列の要素数繰り返す
while i < arrayd.count
#ハッシュの計算
k = arrayd[i] % x
#格納先の配列にすでにデータがある場合(0じゃない場合)
until arrayh[k] == 0
k = (k+1) % x
end
#要素を格納
arrayh[k] = arrayd[i]
i += 1
end
arrayh
end
#データ格納用の配列から値を探索する。
def hash_search(arrayh,target)
#ハッシュ値計算用
x = arrayh.count
#ハッシュ値の計算
k = target % x
#0以外の値が格納されている場合処理を繰り返す。
until arrayh[k] == 0
if arrayh[k] == target
return "格納場所は#{k+1}番目の要素です"
else
k = (k+1) % x
end
end
"#{target}は存在しません。"
end
テストはこちら
require 'minitest/autorun'
class HashTest < Minitest::Test
def test_hash
arrayd = [11,13,17,19,23,29,31]
assert_equal [0,29,0,17,31,19,0,0,0,23,0,11,0,13], hash_storage(arrayd)
end
def test_hash_search
arrayd = [11,13,17,19,23,29,31]
arrayh = hash_storage(arrayd)
assert_equal "格納場所は5番目の要素です" , hash_search(arrayh,31)
assert_equal "12は存在しません。" , hash_search(arrayh,12)
end
end
以上です。間違いやアドバイス等あればコメントいただけると幸いです。
ありがとうございました。