【发布时间】:2016-11-29 16:26:49
【问题描述】:
我有两个数字桶(无序的一维数据结构),我想计算两个桶的任何元素之间的最小距离。有没有办法在O(1) 中找到来自不同桶的任意数字之间的最短距离?我最好的选择是什么?
Input
[B1] 1, 5, 2, 347, 50
[B2] 21, 17, 345
Output
2 // abs(347 - 345)
编辑
- 我希望查找比插入更多
- 任何桶中最小和最大元素之间的距离小于 10^5
- 任意桶的元素个数小于10^5
- 桶中的数字“几乎”排序 - 这些是事件的时间戳。桶中乱序的元素可能不到 1%
- bucket 中的元素数量很少,但我需要以 2k/sec 的平均速率查找,并定期丢弃陈旧的 bucket 并用新的 bucket 替换它们,因此我希望我的查找在
O(1)
了解我为什么需要这个以及我在previous question edition 中的想法。
【问题讨论】:
-
O(1)?当然不是!
-
这些元素必须以某种方式到达桶中,如果在添加它们的同时将每个桶中的所有元素添加到单个平衡树中,您可以获得 O(log n) 查询时间到桶(尽管如果还没有的话,这会将桶插入成本增加到 O(log n)):只需在插入它们时从另一个桶中查找下一个较小和下一个较大的元素,并保持最小的-到目前为止。
-
O(1) 肯定 - 但它会惩罚你的插入性能
-
对每个桶进行排序,然后对它们进行合并排序,跟踪沿途的最小距离:
O(n+n/2.ln(n/2)) = O(n.ln(n))。 -
你的价值观有多大?具体来说,(largest_value - minimum_value) / window_size 有多大?如果这小于 10000000,则只需创建一个该大小的数组,每个 window_size-block 时间块有 2 位。然后在每次将 x 插入存储桶时,让 y = (x - minimum_value) / window_size,并更新 array[y] 和 array[y+1] 以反映添加了来自该存储桶的元素。任何以 window_size 或更少重叠的不同桶项对必须命中 array[] 的相同元素。
标签: c++ algorithm distance intersection euclidean-distance