是否有Python的bisect模块的Go模拟?

时间:2015-04-30 05:14:00

标签: go

我正在寻找Go中Python's bisect module的开箱即用实现。我需要的只是找到一个位置,用于从leftright中排序数组中插入项目。

我知道实现背后的逻辑,但我不希望reinvent the wheel包含所有边缘情况。

1 个答案:

答案 0 :(得分:6)

是。 sort.Search()就是你想要的。它需要一个长度和一个比较函数,并返回函数返回true的第一个索引。链接文档中的示例包括:

i := sort.Search(len(data), func(i int) bool { return data[i] >= x })

i设置为第一个值>= x(或len(data)的索引,如果没有项>= x),那就像{{1}在Python中。将其更改为bisect.bisect_left()即可获得>之类的内容。

Python函数还将搜索列表中的范围;要做类似的事情,你可以搜索切片的子切片,并将其起始偏移量添加到索引bisect_right,如果需要原始切片的索引则返回。还有其他方法,但这看似简单易读。

虽然对于Python列表也是如此,但插入到排序切片中的是O(n),即,它的平均速度是两倍数据的两倍。对于许多目的而言,这仍然很好(很多时候你有一个小列表或几个插入),但当然你不能无限期地扩展。如果您要插入大量项目,例如列表大小的很大一部分,您可以将它们全部附加,然后排序。对于具有对数时间插入,删除等的常规排序集合,总会有例如github.com/cznic/b或任何数量的数据库事物。