[英]List as O(log(n))
我必须在一定条件下制作一个数据结构。
首先,这四个函数必须在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
具有以下实现类: AbstractList
, AbstractSequentialList
, ArrayList
, LinkedList
, Stack
, Vector
这些类大多数都具有O(1)和O(1)<O(log(n))的方法,但始终有一个方法是O(n)。 例如,ArrayList删除了O(n)。
有人对这个问题有任何建议或方法吗?
基本上,我正在寻找一种可以满足这些要求的数据结构。
可索引的跳过列表似乎很合适:插入和删除为O(log n),用于update
索引访问也为 O(log n)。
我的问题是O(log(n))和列表。 有很多树可以在O(log(n))中执行操作(例如BST,红黑树,AVL树),但是如何索引这些树,以及如何将插入树放置在任何地方?
如果仅在Node
类中包含subtreeSize
字段,并在插入/删除/旋转/等时使其保持最新状态。 (这涉及一些簿记,但不会影响您的渐近复杂性),然后您可以根据其左子节点的子树及其祖先的子节点的大小来推断任何给定节点的索引。
但是,您的结果将与那些结果有所不同,因为这些树都已排序,而您只想保留插入操作指定的顺序。 因此,当您在考虑使树保持平衡时,绝对应该让那些想法落在脑海中,但不要让无关的方面误入歧途。
您可以尝试使用列表制作Hashmap。 这样,您的插入,删除和搜索都是O(1)
。 一种简单的方法是制作一个包含链接列表的列表,然后提出一个好的哈希函数以最大程度地减少冲突。 然后,您所要做的实际上就是对这些函数进行编码,并且希望您会拥有所需的性能要求(仅使用高效的算法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.