Пакет suffixarray реализует поиск подстроки за логарифмическое время, используя массив суффиксов в памяти.
Пример использования suffixarray:
// создаем индекс для некоторых данных
index := suffixarray.New(data)
// поиск байтового среза s
// список всех индексов, где s встречается в data
offsets1 := index.Lookup(s, -1)
// список не более 3 индексов, где s встречается в data
offsets2 := index.Lookup(s, 3)
Тип Index
Index реализует массив суффиксов для быстрого поиска подстроки.
type Index struct {
// содержит отфильтрованные или неэкспортированные поля
}
Функция New
func New(data []byte) *Index
New создает новый Index для data. Время создания индекса составляет O(N) для N = len(data).
Метод Bytes
func (x *Index) Bytes() []byte
Bytes возвращает данные, по которым был создан индекс. Его нельзя изменять.
Метод FindAllIndex
func (x *Index) FindAllIndex(r *regexp.Regexp, n int) (result [][]int)
FindAllIndex возвращает отсортированный список неперекрывающихся совпадений регулярного выражения r, где совпадение - это пара индексов, определяющих совпадающий срез x.Bytes(). Если n < 0, все совпадения возвращаются в последовательном порядке. В противном случае возвращается не более n совпадений, и они могут быть непоследовательными. result равен nil, если совпадений нет или если n == 0.
Пример использования FindAllIndex
package main
import (
"fmt"
"index/suffixarray"
"regexp"
)
func main() {
index := suffixarray.New([]byte("banana"))
re, err := regexp.Compile(`an.?`)
if err != nil {
fmt.Println(err.Error())
return
}
offsets := index.FindAllIndex(re, -1)
for _, off := range offsets {
fmt.Println(off)
}
}
Вывод:
[1 4]
Метод Lookup
func (x *Index) Lookup(s []byte, n int) (result []int)
Lookup возвращает несортированный список из не более n индексов, в которых байтовая строка s встречается в индексированных данных. Если n < 0, возвращаются все вхождения. result равен nil, если s пусто, s не найдено или n == 0. Время поиска равно O(log(N)*len(s) + len(result)), где N - размер проиндексированных данных.
Пример использования Lookup
package main
import (
"fmt"
"index/suffixarray"
)
func main() {
index := suffixarray.New([]byte("banana"))
offsets := index.Lookup([]byte("ana"), -1)
for _, off := range offsets {
fmt.Println(off)
}
}
Вывод:
3
1
Метод Read
func (x *Index) Read(r io.Reader) error
Read считывает индекс из r в x; x не должен быть равен nil.
Метод Write
func (x *Index) Write(w io.Writer) error
Write записывает индекс x в w.
Читайте также:
Комментариев нет:
Отправить комментарий