【问题标题】:Is there one type of set-like data structure supporting merging in O(logn) time and k-th search in O(logn) time?(n is the size of this set)是否有一种类似集合的数据结构支持在 O(logn) 时间内合并和在 O(logn) 时间内进行第 k 次搜索?(n 是这个集合的大小)
【发布时间】:2010-10-29 07:04:41
【问题描述】:

是否有一种类集合数据结构支持在 O(logn) 时间内进行合并和在 O(logn) 时间内进行第 k 个元素搜索? n 是这个集合的大小。

【问题讨论】:

  • “kth”是什么意思?你说的是类似集合,但集合不是有序的......
  • kth 表示如果集合是有序的,则排名为 k 的元素。这个数据结构不一定要有序,这里的“set-like”只是用来存储数据的意思。
  • 所以您只想从集合中获取“任何”元素?或者您想检查“给定值是否在集合内”?

标签: algorithm data-structures selection


【解决方案1】:

您可以尝试Fibonacci heap,它确实在恒定摊销时间内合并并在恒定摊销时间内减少密钥。大多数情况下,这样的堆用于反复拉取最小值的操作,因此没有实现检查成员资格功能。但是,使用减少键逻辑添加一个并简单地删除减少部分就足够简单了。

【讨论】:

    【解决方案2】:

    如果 k 是一个常数,那么任何meldable heap 都会这样做,包括leftist heapsskew heapspairing heaps 和斐波那契堆。合并和获取这些结构中的第一个元素通常需要 O(1) 或 O(lg n) 摊销时间,所以 O(klg n) 最大值。

    但是,请注意,到达第 k 个元素可能具有破坏性,因为前 k-1 项可能必须从堆中删除.

    【讨论】:

      【解决方案3】:

      如果您愿意接受摊销,则可以通过使用二叉搜索树表示每个集合来实现融合和搜索所需的 O(lg n) 时间界限。将大小为 m 和 n 的两棵树融合在一起需要时间 O(m log(n / m)),其中 m

      我认为您也可以使用排序数组的集合来表示每个集合,但摊销参数有点棘手。

      正如其他答案中所述,您可以使用堆,但同时获得融合和选择的 O(lg n) 需要一些工作。

      【讨论】:

        【解决方案4】:

        手指树可以做到这一点以及更多的操作:

        http://en.wikipedia.org/wiki/Finger_tree

        如果您不限于纯粹的功能数据结构(即“持久”,这意味着不是“备份在非易失性磁盘存储上”,而是“所有以前的'版本'即使在“添加”其他元素之后,数据结构的一部分仍然可用”)。

        【讨论】:

          猜你喜欢
          • 2012-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          • 2017-03-05
          • 1970-01-01
          相关资源
          最近更新 更多