更具体地说,假设我有一个带有重复项的数组:
{3,2,3,4,2,2,1,4}
我希望有一个支持搜索的数据结构,并且比O(n)更快地删除第一次出现的某个值,比如值为4,然后它变为:
{3,2,3,2,2,1,4}
我还需要按照相同的顺序从头部迭代列表。不需要其他操作,如get(index)或insert
您可以使用O(n)时间在数据结构中记录原始数据(比如说它是一个int []),我只需要稍后的搜索并删除比O(n)更快的速度。
“搜索和删除”被视为如上所示的一个操作
如果我必须自己制作,我会使用LinkedList来存储数据,HashMap将每个键映射到所有节点的列表以及它们的上一个和下一个节点。
这是一种正确的方法吗? Java中是否有更好的选择?
答案 0 :(得分:0)
由于您的要求是应该删除元素的第一次出现并保留剩余的出现次数,因此没有办法比O(n)更快地完成它,因为您肯定必须移动到结束时列表以查明是否存在其他事件。在Java程序包中没有来自Oracle的标准API来执行此操作。
答案 1 :(得分:0)
您描述的数据结构,实质上是混合链表和地图,我认为是处理您所述问题的最有效方法。您必须自己跟踪节点,因为Java的LinkedList
不提供对实际节点的访问。 AbstractSequentialList
在这里可能会有所帮助。
您需要的索引结构是从元素值到列表中该元素外观的映射。我建议将hashCode % modulus
的哈希表推荐给(值,主列表节点列表)的链表。
请注意,在最糟糕的情况下,当您遇到通用哈希冲突时,此方法仍然是O(n);无论您使用开放散列还是封闭散列,这都适用。在一般情况下,它应该更接近O(ln(n)),但我不准备证明这一点。
还要考虑跟踪所有这些的开销是否真的值得获益。除非您实际上已经分析了运行代码,并确定LinkedList
导致问题,因为remove
是O(n),否则请坚持使用。