Java 列为O(日志(n))

Java 列为O(日志(n)),java,algorithm,list,arraylist,data-structures,Java,Algorithm,List,Arraylist,Data Structures,我必须在一定条件下建立一个数据结构 首先,这4个函数必须在Ologn中: insert(Object o) insert(int index, Object o) delete(int index) update(int index, Object o) 第二:数据结构必须实现java.util.List 我的问题是Ologn和列表。有很多树可以在Ologn中执行操作,比如BST、红黑树、AVL树,但是如何对这些树进行索引以及如何在任何地方插入 将此设置为仅列表会带来问题。 ja

我必须在一定条件下建立一个数据结构

首先,这4个函数必须在Ologn中:

insert(Object o)  
insert(int index, Object o)  
delete(int index)  
update(int index, Object o) 
第二:数据结构必须实现java.util.List

我的问题是Ologn和列表。有很多树可以在Ologn中执行操作,比如BST、红黑树、AVL树,但是如何对这些树进行索引以及如何在任何地方插入

将此设置为仅列表会带来问题。 java.util.List具有以下实现类: AbstractList,AbstractSequentialList,ArrayList,LinkedList,Stack,Vector

这些类中的大多数都有O1和O1 有人对这个问题有什么建议或方法吗


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

您可以尝试使用该列表制作一个Hashmap。这样,插入、删除和搜索都是O1。一种简单的方法是创建一个包含链表的列表,然后使用一个好的哈希函数来最小化冲突。然后,您所要做的就是对这些函数进行编码,希望通过使用高效的算法就能够满足您的性能要求。

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

An似乎符合要求:插入和删除是Olog n,而更新的索引访问也是Olog n。

An似乎符合要求:插入和删除是Olog n,更新的索引访问也是Olog n

我的问题是Ologn和列表。有很多树可以在Ologn中执行操作,比如BST、红黑树、AVL树,但是如何对这些树进行索引以及如何在任何地方插入

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

但是,您的结果将与这些有点不同,因为这些树都已排序,而您只希望保留插入操作指定的顺序。因此,当你考虑保持树木的平衡时,你一定要记住这些,但不要让自己被不相关的方面引入歧途

我的问题是Ologn和列表。有很多树可以在Ologn中执行操作,比如BST、红黑树、AVL树,但是如何对这些树进行索引以及如何在任何地方插入

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


但是,您的结果将与这些有点不同,因为这些树都已排序,而您只希望保留插入操作指定的顺序。因此,当您考虑保持树的平衡时,一定要记住这些方面,但不要让自己被不相关的方面引入歧途。

您在编程过程中来得有点太早,不能来这里寻求帮助。您需要提出一个更具体的问题,理想情况下显示您编写的代码。一个以项目索引为排序值的平衡二叉树以及每个节点中的对象有效负载将起作用;基本上,它是一个树映射,可能带有一个防止非连续索引的附加检查。如果要求索引是连续的,那么deleteint将不会是Ologn。那么排序数组呢?应该是Ologn@9000是的,这是我的问题,deleteint不是Ologn..@9000不确定如何在方法中实现随机访问列表。如果元素当前映射为3,并且使用add3,object,那么应该将位于3的元素移动到4。在Olog n中如何做到这一点?在编程过程中,您来这里寻求帮助有点太早了。您需要提出一个更具体的问题,理想情况下显示您编写的代码。一个以项目索引为排序值的平衡二叉树以及每个节点中的对象有效负载将起作用;基本上,它是一个树映射,可能带有一个防止非连续索引的附加检查。如果需要索引
但是,要连续,deleteint不会是Ologn。排序数组呢?应该是Ologn@9000是的,这是我的问题,deleteint不是Ologn..@9000不确定如何在方法中实现随机访问列表。如果元素当前映射为3,并且使用add3,object,那么应该将位于3的元素移动到4。你在奥隆是怎么做到的?是的,我明白了。我想我可以想出一个解决方案,那就是3logn,它仍然是Ologn。谢谢。这不起作用,因为如果你的散列键是索引,那么插入涉及更新所有后续索引,这需要最坏情况下的时间。可能有一个到索引的映射,与散列映射分离。跟踪hashmap中每个条目的索引的某种方法。然后,每当执行删除或插入操作时,都会更新此映射。也许是另一个映射索引和键的hashmap?@Developer:不,那没用。我想你不能这么说,除非你尝试:是的,我明白了。我想我可以想出一个解决方案,那就是3logn,它仍然是Ologn。谢谢。这不起作用,因为如果你的散列键是索引,那么插入涉及更新所有后续索引,这需要最坏情况下的时间。可能有一个到索引的映射,与散列映射分离。跟踪hashmap中每个条目的索引的某种方法。然后,每当执行删除或插入操作时,都会更新此映射。也许是另一个映射索引和键的hashmap?@Developer:不,那没有帮助。我认为你不能这样说,除非你尝试: