リスト検索のアルゴリズムを実装する
Bài đăng này đã không được cập nhật trong 7 năm
アルゴリズムの基礎の基礎だが、考え方はともかくコードにするとどうなるのか考えたことがなかったのでrubyで実装してみた。
線形探索(linear search)
概要
一番単純な探索方法
- 最初から一個ずつ確認して該当するものを探し出す リストの中身がどんな並びでも使える
フローチャート
実装
def linear_search key, array
found = false //検索値ががリストの中に存在しているか否か
array.length.times do |i|
if @array[i] == key
found = true
puts "#{key} は array[#{i}]にありました"
break
end
end
if found == false
puts "#{key}は見つかりませんでした"
end
end
特に問題になることもないですね。
二分探索(binary search)
概要
ソートされているリストでの検索方法 リストの中央の値を取り出して、検索値と比較し、取り出した値よりも前に存在するのか後に存在するのかを絞り込む。 絞り込んだ中から中央の値を取り出して比較して・・・ というふうに範囲を絞りながら検索する方法だ。 リストの中に検索値が存在しなくてもリスト全部にアクセスせずに済む。
実装
def binary_search_tree key, array
found = false //検索値ががリストの中に存在しているか否か
left = 0 //絞り込む範囲の開始位置
right = array.length //絞り込む範囲の終了位置
while left < right //開始位置と終了位置が重なったら(絞込範囲が0になったら)ループ終了
half_point = (left + right) / 2
if array[half_point] == key
found = true
break
else
array[half_point] < key ? left = half_point + 1 : right = half_point
end
end
if found
puts "#{key}はarray[#{half_point}]にありました"
else
puts "#{key}は見つかりませんでした"
end
end
end
ループの終了条件が悩みどころだった。 検索範囲を絞り込むということで、検索範囲を別のリストにしようかとも考えたがリスト自体には手を加えないこちらの方がスマートに感じる。
All rights reserved