Golang中如何编写更优雅的索引遍历算法?

Golang中如何编写更优雅的索引遍历算法? 在文本中,我使用了后缀数组来选取索引。目前我的遍历算法如下所示,但我确信存在使用经典算法的更优雅版本。

index := suffixarray.New(buff.Bytes())
offset := index.Lookup(searchIndex, -1)
sort.Ints(offset)
l := len(offset)
sliceOfBytes := make([][]byte, l)
for iter := 0; l > 0; iter++ {
    if l == 1 {
        sliceOfBytes[iter] = buff.Next(offset[len(offset)-1])
        break
    }
    sliceOfBytes[iter] = buff.Next(offset[iter+1] - offset[iter])
    l--
}

更多关于Golang中如何编写更优雅的索引遍历算法?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

在这之后,sliceOfBytes 的预期结果是什么?我对后缀数组不太熟悉,但在我看来,你似乎获取了 searchIndex 第一次和最后一次出现之间的所有文本。是这样吗?

更多关于Golang中如何编写更优雅的索引遍历算法?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


// 使用双指针遍历,避免复杂的边界判断
index := suffixarray.New(buff.Bytes())
offsets := index.Lookup(searchIndex, -1)
sort.Ints(offsets)

sliceOfBytes := make([][]byte, len(offsets))
for i := 0; i < len(offsets); i++ {
    start := offsets[i]
    end := len(buff.Bytes())
    if i+1 < len(offsets) {
        end = offsets[i+1]
    }
    sliceOfBytes[i] = buff.Bytes()[start:end]
}

// 或者使用更简洁的range遍历
sliceOfBytes2 := make([][]byte, len(offsets))
for i, offset := range offsets {
    next := len(buff.Bytes())
    if i+1 < len(offsets) {
        next = offsets[i+1]
    }
    sliceOfBytes2[i] = buff.Bytes()[offset:next]
}

// 如果需要处理buff.Next(),可以这样优化
sliceOfBytes3 := make([][]byte, len(offsets))
buffCopy := bytes.NewBuffer(buff.Bytes()) // 创建副本避免修改原buff
for i := 0; i < len(offsets); i++ {
    size := len(buff.Bytes()) - offsets[i]
    if i+1 < len(offsets) {
        size = offsets[i+1] - offsets[i]
    }
    sliceOfBytes3[i] = buffCopy.Next(size)
}
回到顶部