Commit 6f182333 authored by Eric Eisner's avatar Eric Eisner Committed by Robert Griesemer

suffixarray: generate less garbage during construction

Minorly improves runtime by about 2-3%

R=gri, jeff
CC=golang-dev
https://golang.org/cl/5052045
parent 6b6cb725
...@@ -37,7 +37,7 @@ func qsufsort(data []byte) []int32 { ...@@ -37,7 +37,7 @@ func qsufsort(data []byte) []int32 {
inv := initGroups(sa, data) inv := initGroups(sa, data)
// the index starts 1-ordered // the index starts 1-ordered
sufSortable := &suffixSortable{sa, inv, 1} sufSortable := &suffixSortable{sa: sa, inv: inv, h: 1}
for int(sa[0]) > -len(sa) { // until all suffixes are one big sorted group for int(sa[0]) > -len(sa) { // until all suffixes are one big sorted group
// The suffixes are h-ordered, make them 2*h-ordered // The suffixes are h-ordered, make them 2*h-ordered
...@@ -135,6 +135,7 @@ type suffixSortable struct { ...@@ -135,6 +135,7 @@ type suffixSortable struct {
sa []int32 sa []int32
inv []int32 inv []int32
h int32 h int32
buf []int // common scratch space
} }
func (x *suffixSortable) Len() int { return len(x.sa) } func (x *suffixSortable) Len() int { return len(x.sa) }
...@@ -142,7 +143,7 @@ func (x *suffixSortable) Less(i, j int) bool { return x.inv[x.sa[i]+x.h] < x.inv ...@@ -142,7 +143,7 @@ func (x *suffixSortable) Less(i, j int) bool { return x.inv[x.sa[i]+x.h] < x.inv
func (x *suffixSortable) Swap(i, j int) { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] } func (x *suffixSortable) Swap(i, j int) { x.sa[i], x.sa[j] = x.sa[j], x.sa[i] }
func (x *suffixSortable) updateGroups(offset int) { func (x *suffixSortable) updateGroups(offset int) {
bounds := make([]int, 0, 4) bounds := x.buf[0:0]
group := x.inv[x.sa[0]+x.h] group := x.inv[x.sa[0]+x.h]
for i := 1; i < len(x.sa); i++ { for i := 1; i < len(x.sa); i++ {
if g := x.inv[x.sa[i]+x.h]; g > group { if g := x.inv[x.sa[i]+x.h]; g > group {
...@@ -151,6 +152,7 @@ func (x *suffixSortable) updateGroups(offset int) { ...@@ -151,6 +152,7 @@ func (x *suffixSortable) updateGroups(offset int) {
} }
} }
bounds = append(bounds, len(x.sa)) bounds = append(bounds, len(x.sa))
x.buf = bounds
// update the group numberings after all new groups are determined // update the group numberings after all new groups are determined
prev := 0 prev := 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment