列为O(log(n))

时间:2017-03-02 15:53:18

标签: java algorithm list arraylist data-structures

我必须制作具有特定条件的数据结构。

首先这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))和List。有很多树可以在O(log(n))中进行操作(如BST,红黑树,AVL树),但是如何对这些树进行索引以及插入如何在任何地方?

将其设置为仅列表确实会出现问题。 java.util.List有以下实现类: AbstractListAbstractSequentialListArrayListLinkedListStackVector

这些类中的大多数具有O(1)和O(1)的方法。 O(log(n)),但总有一个方法是O(n)。示例ArrayList删除了O(n)。

有没有人对此问题有任何建议或方法?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

  

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

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

您的结果与那些结果略有不同,因为这些树都已排序,而您只想保留插入操作指定的顺序。因此,当你考虑保持树木平衡时,你绝对应该把它们放在脑海中,不要让自己被不相关的方面误导。

答案 2 :(得分:0)

您可以尝试使用List制作Hashmap。这样,您的插入,删除和搜索都是O(1)。一个简单的方法可能是制作一个包含链表的列表,然后提出一个好的哈希函数来最小化冲突。然后,你所要做的就是编写这些函数,你希望有所需的性能要求(只需使用有效的算法)。