Goに慣れるためとアルゴリズムの復習の為に週1ぐらいで更新していきます。アルゴリズムクイックリファレンス 第2版を読んで各種アルゴリズムをGoで実装して行きます。
前回: Goでのアルゴリズムクイックリファレンス第2版(マージソート)
今回は二分探索
ソート済みのリストや配列に入ったデータ(同一の値はないものとする)に対する検索を行うにあたって、 中央の値を見て、検索したい値との大小関係を用いて、検索したい値が中央の値の右にあるか、左にあるかを判断して、片側には存在しないことを確かめながら検索していく
計算時間はO(log2n)となる
package main
import (
	"fmt"
)
func search(a *[]int, t int) bool {
	low := 0
	high := len(*a) - 1
	for low <= high {
		mid := (low + high) / 2
		if t < (*a)[mid] {
			high = mid - 1
		} else if t > (*a)[mid] {
			low = mid + 1
		} else {
			return true
		}
	}
	return false
}
func main() {
	a := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
	fmt.Println(a)
	fmt.Printf("2:%t\n", search(&a, 2))
	fmt.Println(a)
	fmt.Printf("12:%t\n", search(&a, 12))
}
次回はハッシュに基づいた探索の予定です。