작동 원리 :,, 추측이 큰 경우에 당신은 당신이 게임, 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)
}
먼저 쓰기, ~ 계속 추가 완료