mirror of
https://github.com/golang/go
synced 2024-11-25 06:57:58 -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:
parent
61978aa579
commit
d93b2f384d
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,6 +99,12 @@ var testCases = []testCase{
|
|||||||
"to (come|the)?",
|
"to (come|the)?",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"godoc simulation",
|
||||||
|
"package main\n\nimport(\n \"rand\"\n ",
|
||||||
|
[]string{},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user