mirror of
https://github.com/golang/go
synced 2024-11-25 00:57:59 -07:00
index/suffixarray: use sort.Search
R=gri CC=golang-dev https://golang.org/cl/3200041
This commit is contained in:
parent
07791d04d6
commit
b51f0c5cca
@ -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 {
|
func (x *Index) search(s []byte) int {
|
||||||
i, j := 0, len(x.sa)
|
return sort.Search(len(x.sa), func(i int) bool { return bytes.Compare(x.at(i), s) >= 0 })
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -84,12 +71,7 @@ func (x *Index) Lookup(s []byte, n int) []int {
|
|||||||
if len(s) > 0 && n != 0 {
|
if len(s) > 0 && n != 0 {
|
||||||
// find matching suffix index i
|
// find matching suffix index i
|
||||||
i := x.search(s)
|
i := x.search(s)
|
||||||
// x.at(i) <= s < x.at(i+1)
|
// x.at(i-1) < s <= x.at(i)
|
||||||
|
|
||||||
// ignore the first suffix if it is < s
|
|
||||||
if i < len(x.sa) && bytes.Compare(x.at(i), s) < 0 {
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
|
|
||||||
// collect the following suffixes with matching prefixes
|
// collect the following suffixes with matching prefixes
|
||||||
for (n < 0 || len(res) < n) && i < len(x.sa) && bytes.HasPrefix(x.at(i), s) {
|
for (n < 0 || len(res) < n) && i < len(x.sa) && bytes.HasPrefix(x.at(i), s) {
|
||||||
|
Loading…
Reference in New Issue
Block a user