58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
func Search(n int, f func(int) bool) int {
// Define f(-1) == false and f(n) == true.
// Invariant: f(i-1) == false, f(j) == true.
i, j := 0, n
for i < j {
h := int(uint(i+j) >> 1) // avoid overflow when computing h
// i ≤ h < j
if !f(h) {
i = h + 1 // preserves f(i-1) == false
} else {
j = h // preserves f(j) == true
}
}
// i == j, f(i-1) == false, and f(j) (= f(i)) == true => answer is i.
return i
}
|
- 63: h는 i, j의 중간지점
- 66: f(h) = False => i++
- 68: f(h) = True => j--
결론
sort.Search 입장에서 배열은 이렇게 보인다.
0 |
1 |
… |
k-1 |
k |
k+1 |
… |
n-2 |
n-1 |
false |
false |
… |
false |
true |
true |
… |
true |
true |
그러므로 파라미터로 전달하는 f func(int) bool) int
함수는 여기에 맞춰서 정의하면 된다.
그리고 항상 첫번째 true 인덱스를 반환한다는 점도 기억해야겠다.