とにもかくにも、銭湯から順番に調べて、探しているものが見つかれば、それを返す。
class LinearSearch def initialize @array = Array.new(20) @array.each_index do |i| @array[i] = rand(10) end p @array end def main puts "何を探しますか?" x = intReader r = linearSearch(x) if r == -1 puts "#{x}は見つからなかった。" else puts "#{x}を#{r + 1}番目に発見した。" end end private def intReader gets().to_i end # サーチアルゴリズム def linearSearch(x) n = 0 while n < @array.size && @array[n] != x do n += 1 end return n if n < @array.size return -1 end end search = LinearSearch.new search.main
class LinearSearch def initialize @array = Array.new(20) @array.each_index do |i| @array[i] = rand(10) end p @array end def main puts "何を探しますか?" x = intReader r = linearSearch(x) if r == -1 puts "#{x}は見つからなかった。" else puts "#{x}を#{r + 1}番目に発見した。" end end private def intReader gets().to_i end # サーチアルゴリズム def linearSearch(x) n = 0 # 最後の値を x に入れ替える(番兵をたてる) t = @array.pop @array.push(x) # 目的の値を探す while @array[n] != x do n += 1 end # 最後の値を元に戻す @array[-1] = t return n if n < @array.size - 1 return n if x == t return -1 end end search = LinearSearch.new search.main
●冨倉メモ
Ruby では、番兵を立てる必要は、あんまりないかも。
class BinarySearch def initialize @array = Array.new(20) @array.each_index do |i| @array[i] = rand(10) end p @array end def main # 検索前にソートをしておく必要がある puts "並び替え中" array = @array.sort p array puts "何を探しますか?" x = intReader r = binarySearch(x, array) if r == -1 puts "#{x}は見つからなかった。" else puts "#{x}を#{r + 1}番目に発見した。" end end private def intReader gets().to_i end # サーチアルゴリズム def binarySearch(x, array) left = 0 right = array.size - 1 mid = nil while left <= right do mid = (left + right) / 2 return mid if array[mid] == x if array[mid] < x left = mid + 1 else right = mid - 1 end end return -1 end end search = BinarySearch.new search.main
class BinarySearch def initialize @array = Array.new(20) @array.each_index do |i| @array[i] = rand(10) end p @array end def main # 検索前にソートをしておく必要がある puts "並び替え中" array = @array.sort p array puts "何を探しますか?" x = intReader r = binarySearch(x, array) if r == -1 puts "#{x}は見つからなかった。" else puts "#{x}を#{r + 1}番目に発見した。" end end private def intReader gets().to_i end # サーチアルゴリズム def binarySearch(x, array) left = 0 right = array.size - 1 mid = nil while left < right do mid = (left + right) / 2 if array[mid] < x left = mid + 1 else right = mid end end return left if array[left] == x return -1 end end search = BinarySearch.new search.main
class Book attr_reader :title, :author, :bookID, :available def initialize( title, author, bookID, available ) @title = title @author = author @bookID = bookID @available = available end end class SearchBook def initialize @bookArray = Array.new() end def main() initDate() sortBook(0, @bookArray.size - 1, @bookArray) while true do puts "検索する本のIDを入力して下さい。" puts "(終了する場合は 0 を入力)" key = intReader() break if key == 0 position = searchBook(@bookArray, key) if position != -1 puts "---------- 次の本が見つかりました。" puts "[Title] : #{@bookArray[position].title}" puts "[Author]: #{@bookArray[position].author}" if @bookArray[position].available puts "この本は貸し出し可能です" else puts "この本は貸出中です" end else puts "お探しの本は見つかりませんでした" end end end private def intReader gets().to_i end def searchBook( books, key ) left = 0 mid = nil right = books.size - 1 while left < right do mid = (left + right) / 2 if books[mid].bookID < key left = mid + 1 else right = mid end end return left if books[left].bookID == key return -1 end def initDate() @bookArray[0] = Book.new("book0", "author0", 1000, true) @bookArray[1] = Book.new("book1", "author1", 502, false) @bookArray[2] = Book.new("book2", "author2", 731, false) @bookArray[3] = Book.new("book3", "author3", 628, true) @bookArray[4] = Book.new("book4", "author4", 1, true) end def sortBook( bottom, top, books ) lower = bottom upper = top div = nil return if bottom >= top # 適当な基準を選択 div = books[bottom].bookID while lower < upper do while books[lower].bookID < div do lower += 1 end while books[upper].bookID > div do upper -= 1 end if lower < upper temp = books[lower] books[lower] = books[upper] books[upper] = temp lower += 1 upper -= 1 end end sortBook(bottom, upper, books) sortBook(upper + 1, top, books) end end searchBook = SearchBook.new searchBook.main
一致した値を配列の先頭に持ってくることで、次回以降の検索を素早く行う。全体の中で一部の値だけが何度も検索される場合に有効。
参考:リスト「自己組織化探索」
class OrganizationSearch def initialize @array = Array.new(20) @array.each_index do |i| @array[i] = rand(20) end end def main while true p @array puts "何を探しますか? [-1 で終了]" x = intReader if x == -1 break end r = organizationSearch(x, @array) if r == -1 puts "見つかりません" else puts "#{x} は #{r} 番目です" end end end private def intReader gets().to_i end def organizationSearch(x, a) n = 0 while (n < a.size && a[n] != x) n += 1 end if n < a.size if n > 0 t = a[n - 1] a[n - 1] = a[n] a[n] = t return n - 1 end return n end return -1 end end o = OrganizationSearch.new o.main