同时检查字符串是否在切片中?

Concurrently check if string is in slice?

提问人:motrait 提问时间:4/9/2022 更新时间:4/9/2022 访问量:108

问:

通常,为了检查字符串是否在切片中,我用 for 循环和 if 语句编写一个函数。但是,在字符串或结构类型的大切片的情况下,它确实效率低下。是否可以同时进行此检查?

字符串 for 循环 go slice 包含

评论

3赞 colm.anseo 4/9/2022
启动多个 goroutine 来执行简单的索引扫描的开销可能不值得。如果需要加快重复查找速度,请考虑编制索引。

答:

3赞 Jakub Dóka 4/9/2022 #1

对顺序数据进行并发搜索通常不是一个好主意,仅仅是因为我们已经有一个二进制搜索,甚至可以很好地扩展数十亿条记录。要使用它,您所要做的就是在您正在搜索的切片之上构建索引。若要生成最简单的索引,必须将键及其指向的数据索引一起保存到另一个切片中。一旦你有了切片,只需按字符串对它进行排序,索引就完成了。

您必须对刚刚创建的索引执行二进制搜索才能提高效率。这样你就有了 O(log N) 的复杂度。

另一个更简单的选项是创建并插入所有键以及索引。然后在地图中找到索引。这可以是 O(1) 的最佳情况。map[string]int

需要注意的重要一点是,如果您只需要对给定切片执行一次搜索,这是不值得的,因为创建索引比线性搜索要重得多。