0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyでハッシュ探索法を書いてみたMinitestでテストしてみた

Last updated at Posted at 2020-05-06

##はしめに
今回はこちらの本でアルゴリズムの勉強をしているので学んだハッシュ探索法を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

以上です。間違いやアドバイス等あればコメントいただけると幸いです。
ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?