【问题标题】:Is it possible to add/update a sorted list in constant time?是否可以在恒定时间内添加/更新排序列表?
【发布时间】:2016-10-18 19:39:20
【问题描述】:

假设给定一个已排序的整数列表,例如 (1,7,13,14,50)。请注意,该列表不会包含重复项。

是否有一些数据结构可以存储它,同时允许我在恒定时间内添加任何新元素(在它的适当位置)? add(10) 将产生 (1,7,10,13,14,50)。

同样,我能否更新一个元素(例如将 7 更改为 19)并在恒定时间内相应地改变顺序?更改(7,19)产生(1,13,14,19,50)。

对于一个类,我需要编写一个尽可能快地执行这些操作的数据结构,但我只是想知道是否可以完成恒定时间,如果不能,那么理想的运行时是什么?

【问题讨论】:

  • 在列表中你仍然需要O(n) 来定位元素。 HashMap 使用O(1) 来定位元素。
  • “是否可以在恒定时间内添加/更新排序列表?” vs “尽可能快地执行这些操作,” 是有点矛盾。根据我的理解,“恒定时间”意味着:无论需要在哪里完成操作,它总是需要相同的时间。在大约 50% 的情况下,“尽可能快”的解决方案将比“恒定时间”的解决方案更快。
  • 你想解决什么问题。你真的需要维护一个排序列表吗?还是您只需要一个可以让您有效地插入和更新项目的数据结构?

标签: java sorting data-structures


【解决方案1】:

要在常数时间内插入,O(1),这只会作为任何数据结构的最佳情况发生。哈希表通常具有最佳插入时间,但如果存在冲突并且存在单独的链接,则可能并不总是 O(1)。您不对哈希进行排序,因此复杂性无关紧要。

二叉树的插入时间很长,而且作为奖励,它在插入新节点时已经排序。然而,这需要平均 O(logn) 时间。如果树为空,则插入的最佳情况是 O(1)。

这些只是几个示例,有关这些操作的复杂性的更多信息,请参见此处:http://bigocheatsheet.com/

【讨论】:

    【解决方案2】:

    一般?不。确定插入新元素的位置或在插入后重新排序列表涉及执行列表内容的分析,这涉及读取列表的元素,这(通常)意味着迭代列表长度的某些部分.这(同样,通常)取决于列表中有多少元素,根据定义,这不是一个常数。因此,除非在特殊情况下,否则根本不可能进行恒定时间排序的插入。

    【讨论】:

      【解决方案3】:

      二叉树 TreeSet 就足够了。带有 Arrays.binarySearch 和 Arrays.copy 的数组也可以,因为这里我们有整数,然后我们不需要包装类 Integer。

      对于实常数时间,O(1),必须支付空间。使用 BitSet。要添加 17,只需将 17 设置为 true。有优化的方法来查找下一个设置位等等。

      但我怀疑此时是否真的需要优化。文件 I/O 可能会带来更多回报。

      【讨论】:

      • BitSet 是否合理取决于他的数字范围。正如你所说,你支付空间。如果他的范围是 32 位整数,他需要半 GB(2^32 位是 2^29 字节)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 2013-05-12
      • 2019-03-25
      相关资源
      最近更新 更多