【发布时间】:2021-10-19 12:04:21
【问题描述】:
我正在尝试查找是否有人以以下方式实现了二进制搜索 -
假设我们有一些元素的数组,放置在连续的内存中。
那么当你比较中间元素时,接下来的几个元素应该已经在 CPU 缓存中了。比较应该已经免费了?
但我找不到这样做的人。
如果没有人这样做,可能是什么原因?
【问题讨论】:
-
看起来更新这样的集合会导致大量开销。然而,如果一个集合是只读的或不经常修改的,这无关紧要。 (毕竟,有
boost::flat_map对每次插入进行排序,这也是很大的开销)。 -
作为一个接近的选择,看看这个abseil.io/about/design/btree
-
在庞大的数据结构中,搜索到的值与当前查看的值非常接近的概率非常小。当二分法即将结束时,该策略开始有用,但由于可能的缓存未命中,与之前的二分法步骤相比,在加载的缓存行上执行二分法的成本很小。如果项目在内存中很小,这对于提前预取数据更有用。如果整个数据结构不适合缓存,所有这些都尤其正确。
标签: performance containers binary-search cpu-cache