是否有一种类似集合的数据结构支持O(logn)时间的合并以及O(logn)时间内的第k个元素搜索? n是这个集合的大小。
答案 0 :(得分:2)
您可以尝试Fibonacci heap,它会在常量摊销时间内合并,并在常量摊销时间内减少关键字。大多数情况下,这样的堆用于重复提取最小值的操作,因此不实现check-for-membership功能。但是,使用减小键逻辑添加一个,并简单地删除减少部分就足够了。
答案 1 :(得分:2)
如果 k 是常量,那么任何meldable heap都会执行此操作,包括leftist heaps,skew heaps,pairing heaps和斐波纳契堆。合并和获取这些结构中的第一个元素通常需要 O (1)或 O (lg n )分摊时间,因此 O ( k lg n )最大值。
但是,请注意,在第一个 k -1项可能必须从堆中删除的情况下,获取 k '元素可能具有破坏性
答案 2 :(得分:0)
如果您愿意接受摊销,您可以通过使用二叉搜索树来表示每个集合,从而实现对于融合和搜索的O(lg n)时间的期望界限。将大小为m和n的两棵树一起熔化需要时间O(m log(n / m)),其中m 我认为您也可以使用排序数组的集合来表示每个集合,但是摊销参数有点棘手。 正如其他答案所述,你可以使用堆,但是为meld和select获得O(lg n)需要一些工作。
答案 3 :(得分:0)
手指树可以执行此操作以及其他一些操作:
http://en.wikipedia.org/wiki/Finger_tree
如果您不仅限于纯粹的功能数据结构(也就是说“持久性”,这意味着不是“备份在非易失性磁盘存储上”,而是“所有以前的版本”,那么可能会有更好的东西)即使在“添加”其他元素之后,数据结构也可用。“