- 如何创建一个索引
- 使用正则表达式索引
- 将索引写入io.writer
- 将数据读取到索引中
索引实现了一个快速子字符串的索引,比如我们要在字符传'1234445555644',查找所有字符4出现的下标,使用索引就能已最快的速度计算
创建索引
New 为数据创建一个新的索引。对于N = len(data)
,索引创建时间为 O(N*log(N))
func (x *Index) Lookup(s []byte, n int) (result []int)
package main
import (
"index/suffixarray"
"fmt"
)
func main() {
s := []byte("12345672890")
index := suffixarray.New(s)
result := index.Lookup([]byte("2"),2)
fmt.Println(result)
}
image.png
搜索子字符串出现在字符串中的位置,Lookup
参数n表示查找几个,-1 表示查找所有的位置下标
使用正则表达式索引子串位置
如果对正则表达式不清楚,请先看正则表达式章节
package main
import (
"index/suffixarray"
"fmt"
"regexp"
)
func main() {
s := []byte("12422222")
index := suffixarray.New(s)
reg := regexp.MustCompile(`2+`)
result := index.FindAllIndex(reg,-1)
fmt.Println(result)
}
image.png
将索引写入io.writer
package main
import (
"index/suffixarray"
"fmt"
"bytes"
)
func main() {
s := []byte("ab")
index := suffixarray.New(s)
var w bytes.Buffer
index.Write(&w)
fmt.Println(string(string(w.Bytes())))
}
image.png
将数据读取到索引中
func (x *Index) Read(r io.Reader) error
package main
import (
"index/suffixarray"
"fmt"
"bytes"
)
func main() {
var index *suffixarray.Index = new(suffixarray.Index)
var w = new(bytes.Buffer)
w.WriteString("abcd")
fmt.Println(w)
index.Read(w)
fmt.Println(index)
}
网友评论