バイナリ検索アルゴリズム分析とまとめ

どのように動作します:;、推測が大きい場合、あなたはゲーム、1-100を推測やっていると思いますが、あなたはそれが50試合の終わりがある場合は最初、右の彼に尋ねるために50を取る、番号を推測する必要がありますその後、あなたは確かに50-100の推測の間ではありませんが、1から49までの間の間隔を縮小する(両方とも包括的には)推測していき、あなたのサイズに応じた間隔を作るために彼を求める権利の中間値を取るしていきますコントロールは、ので、徐々にその数はどのくらい知っている、特にすることができます縮小します。ときに結果を返しますか?あなたはこの数、または0の範囲の収縮が収縮することはできません見つけること(を見ているが、見つけることができませんでした)。

もちろん、どの2つのポイントは、あなた最も愚かな方法は1つの右によって彼にものを尋ねることはありません、あなたが100回を推測する必要があり、最悪の場合...コードに反映さは、トラバーサルの順序で、1から100まで尋ねました。

条件:データの順序集合

二部実現(注意点はコメントしています)

func search2(arr []int, low, high, num int) int {

	// 缩小区间最后会出现[12,12]的情况,因此循环的条件不能是low < high,而是low <= high,
	// 当然如果你开始传入的high本身就是len(arr)而非len(arr)-1,那此处就可以low < high
	for low <= high {
		midIndex := (low + high) / 2
		//fmt.Println("low=", low, "   high=", high, "   mid=", midIndex)
		if arr[midIndex] == num { // 如果最中间的值就是要找的数,直接返回索引
			return midIndex
		} else if num < arr[midIndex] {
			high = midIndex - 1
		} else if num > arr[midIndex] { 
			low = midIndex + 1 // 移动区间端点进行缩小区间
		}
	}

	return -1
}

各実行の一部はまた、再帰を使用して実施することができる同じロジックで見ることができます。

func search3(arr []int, low, high, num int) int {
	if low > high { // 没找到时递归结束
		return -1
	}

	midIndex := (low + high) / 2
	if arr[midIndex] == num {
		return midIndex
	} else if num < arr[midIndex] {
		high = midIndex - 1
	} else if num > arr[midIndex] {
		low = midIndex + 1
	}

	return search3(arr, low, high, num)
}

まず書き込み、完成を追加していく〜

 

 

彼は182元の記事を発表 ウォンの賞賛132 ビュー90000 +

おすすめ

転載: blog.csdn.net/HYZX_9987/article/details/104800013