이진 검색 알고리즘 분석 및 요약

작동 원리 :,, 추측이 큰 경우에 당신은 당신이 게임, 1-100 추측하고있는 생각, 당신은 그 50 게임의 끝이 경우 먼저 오른쪽 물어 (50)를 취할 것, 수를 생각해야합니다 당신은 확실히 50 ~ 100 추측 사이에 수 없지만 1-49 사이의 간격 축소 (모두 포함) 추측 계속, 당신은 간격이 크기에 따라 만들어달라고 오른쪽의 중간 값을 계속됩니다 제어 등 점차 그 숫자가 얼마나 구체적으로 알 수있을 것입니다 축소. 때 결과를 반환? 이 번호 또는 0의 범위의 정신과는 계약을 체결 할 수 없다 찾아 낸다 (이상 찾고 있지만 찾을 수 없습니다).

물론, 두 개의 점, 다음 가장 어리석은 방법은 하나의 권리가 그에게 일을 부탁하지, 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