]> Cypherpunks repositories - gostls13.git/commitdiff
index/suffixarray: use sort.Search
authorRuss Cox <rsc@golang.org>
Fri, 19 Nov 2010 21:04:25 +0000 (16:04 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 19 Nov 2010 21:04:25 +0000 (16:04 -0500)
R=gri
CC=golang-dev
https://golang.org/cl/3200041

src/pkg/index/suffixarray/suffixarray.go

index 0a17472962fadb036d35848c955c55c47ff15cc8..4839dbb146a938e27315e2bf6bc768a63ece31dc 100644 (file)
@@ -54,21 +54,8 @@ func (x *Index) at(i int) []byte {
 }
 
 
-// Binary search according to "A Method of Programming", E.W. Dijkstra.
 func (x *Index) search(s []byte) int {
-       i, j := 0, len(x.sa)
-       // i < j for non-empty x
-       for i+1 < j {
-               // 0 <= i < j <= len(x.sa) && (x.at(i) <= s < x.at(j) || (s is not in x))
-               h := i + (j-i)/2 // i < h < j
-               if bytes.Compare(x.at(h), s) <= 0 {
-                       i = h
-               } else { // s < x.at(h)
-                       j = h
-               }
-       }
-       // i+1 == j for non-empty x
-       return i
+       return sort.Search(len(x.sa), func(i int) bool { return bytes.Compare(x.at(i), s) >= 0 })
 }
 
 
@@ -84,12 +71,7 @@ func (x *Index) Lookup(s []byte, n int) []int {
        if len(s) > 0 && n != 0 {
                // find matching suffix index i
                i := x.search(s)
-               // x.at(i) <= s < x.at(i+1)
-
-               // ignore the first suffix if it is < s
-               if i < len(x.sa) && bytes.Compare(x.at(i), s) < 0 {
-                       i++
-               }
+               // x.at(i-1) < s <= x.at(i)
 
                // collect the following suffixes with matching prefixes
                for (n < 0 || len(res) < n) && i < len(x.sa) && bytes.HasPrefix(x.at(i), s) {