1
0
mirror of https://github.com/golang/go synced 2024-11-25 09:37:56 -07:00

suffixarray: fix construction bug

Previously, group numbers were updated while being read,
sometimes leading to inconsistencies.

R=gri, gri1
CC=golang-dev
https://golang.org/cl/4121045
This commit is contained in:
Eric Eisner 2011-01-31 13:13:02 -08:00 committed by Robert Griesemer
parent 61978aa579
commit d93b2f384d
2 changed files with 24 additions and 12 deletions

View File

@ -146,19 +146,25 @@ func (x *suffixSortable) Swap(i, j int) { x.sa[i], x.sa[j] = x.sa[j], x.sa[
func (x *suffixSortable) updateGroups(offset int) { func (x *suffixSortable) updateGroups(offset int) {
prev := len(x.sa) - 1 bounds := make([]int, 0, 4)
group := x.inv[x.sa[prev]+x.h] group := x.inv[x.sa[0]+x.h]
for i := prev; i >= 0; 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 {
if prev == i+1 { // previous group had size 1 and is thus sorted bounds = append(bounds, i)
x.sa[i+1] = -1
}
group = g group = g
prev = i
}
x.inv[x.sa[i]] = prev + offset
if prev == 0 { // first group has size 1 and is thus sorted
x.sa[0] = -1
} }
} }
bounds = append(bounds, len(x.sa))
// update the group numberings after all new groups are determined
prev := 0
for _, b := range bounds {
for i := prev; i < b; i++ {
x.inv[x.sa[i]] = offset + b - 1
}
if b-prev == 1 {
x.sa[prev] = -1
}
prev = b
}
} }

View File

@ -99,6 +99,12 @@ var testCases = []testCase{
"to (come|the)?", "to (come|the)?",
}, },
}, },
{
"godoc simulation",
"package main\n\nimport(\n \"rand\"\n ",
[]string{},
},
} }