【问题标题】:List as O(log(n))列出为 O(log(n))
【发布时间】:2017-07-22 10:47:13
【问题描述】:

我必须在某些条件下创建一个数据结构。

首先这4个函数必须在O(log(n))中:

insert(Object o)  
insert(int index, Object o)  
delete(int index)  
update(int index, Object o) 

第二:数据结构必须实现java.util.List

我的问题是 O(log(n)) 和列表。有很多树可以在 O(log(n)) 中进行操作(例如 BST、红黑树、AVL 树),但是这些树如何被索引以及如何插入到任何地方?

将其设置为仅列表确实会带来问题。 java.util.List 有这些实现类: AbstractListAbstractSequentialListArrayListLinkedListStackVector

这些类中的大多数都有 O(1) 和 O(1)

有人对这个问题有任何建议或方法吗?

基本上,我正在寻找能够满足这些要求的数据结构。

【问题讨论】:

  • 您在编程过程中来这里寻求帮助有点太早了。你需要问一个更具体的问题,最好能展示你编写的代码。
  • 提示:如果按顺序遍历树,则可以将其视为列表。以项目的 index 作为排序值的平衡二叉树和每个节点中的 Object 有效负载将起作用;基本上它是一个TreeMap<Integer, Object>,可能还有一个防止非连续索引的附加检查。 (如果要求索引是连续的,delete(int) 不会是 O(log(n))。)
  • 排序数组呢?应该是 O(log(n))
  • @9000 是的,这是我的问题,delete(int) 不是 O(log(n))..
  • @9000 不确定如何在您的方法中实现具有随机访问的列表。如果一个元素当前映射到 3,并且其中一个使用 add(3,object),那么应该将位于 3 的元素移动到 4。你如何在 O(log n) 中做到这一点?

标签: java algorithm list arraylist data-structures


【解决方案1】:

indexable skip list 似乎符合要求:插入和删除是 O(log n),update 的索引访问也是 O(log n)。

【讨论】:

    【解决方案2】:

    我的问题是 O(log(n)) 和列表。有很多树可以在 O(log(n)) 中完成操作(例如 BST、Red-Black Tree、AVL Tree),但是这些树如何被索引,如何插入到任何地方?

    如果您只是在 Node 类中包含一个 subtreeSize 字段,并在插入/删除/旋转/等时使其保持最新。 (这涉及一些簿记,但不会影响您的渐近复杂性),那么您可以通过其左孩子的子树及其祖先的大小来推断任何给定节点的索引。

    但是,您的结果将与那些结果略有不同,因为这些树都已排序,而您只想保留插入操作指定的顺序。因此,尽管在考虑保持树平衡时,您绝对应该将这些放在脑海中,但不要让自己被无关的方面误入歧途。

    【讨论】:

      【解决方案3】:

      您可以尝试使用 List 制作 Hashmap。这样你的插入、删除和搜索都是O(1)。一个简单的方法是创建一个包含链表的列表,然后提出一个好的散列函数来最小化冲突。然后,您所要做的就是对这些函数进行实际编码,并希望您能够满足您需要的性能要求(只需使用高效的算法)。

      【讨论】:

      • 是的,我明白了。我想我可以想出一个 3log(n) 的解决方案,它仍然是 O(log(n) 谢谢
      • 这不起作用,因为如果您的哈希键是索引,那么插入涉及更新所有后续索引,这需要最坏情况的 O(n) 时间。
      • 可能存在到索引的映射,与哈希图分开。跟踪哈希图中每个条目的索引的某种方法。然后,每当执行删除或插入时,都会更新此映射。也许另一个映射索引和键的哈希图?
      • @Developer:不,这没有帮助。
      • 在你尝试之前我认为你不能这么说:)
      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多