【发布时间】:2014-03-22 07:40:39
【问题描述】:
更具体地说,假设我有一个包含重复项的数组:
{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) 更快。
如上所示,“搜索和删除”被视为 ONE 操作。
如果我必须自己制作,我会使用 LinkedList 来存储数据,并使用 HashMap 将每个键映射到所有出现的节点及其上一个和下一个节点的列表。
这是一个正确的方法吗? Java 中是否已有更好的选择?
【问题讨论】:
-
如果它是一个未排序的输入数据,你永远不会比 O(n) 更好地删除重复项,因为你必须遍历每一个元素才能找到。
-
你可以用 O(n) 时间来设置数据结构,我需要稍后搜索和删除才能更快。
-
好的,如何获取一个Set
,循环输入数据。如果整数不在 Set 中,则写入输出数组并将整数添加到 Set 中。最后,您将得到一个没有重复的输出数组,并保留顺序。 -
@anonymous 一般的
Set没有排序,并且没有任何 JRE 实现根据插入排序。 -
我正在为您的实际问题写一个答案,但如果您描述了您正在完成的工作,可能会有更有效的方法来处理它。
标签: java data-structures hash linked-list duplicates