Go sort.Search()

Posted on Dec 29, 2023
tl;dr: k가 찾고자 하는 인덱스일 때, f는 [k,n)에서 true

sort.Search 소스코드

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 인덱스를 반환한다는 점도 기억해야겠다.