首先,我为冗长的回答道歉。如果我在任何时候错了,随时欢迎您纠正我。这里我比较了一些解决方案的选项
选项 1 :
在您的代码中,您使用了ArrayList.removeAll 方法,让我们看看 removeAll 的代码
removeAll的源码
public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
}
所以需要知道batchRemove 方法中的内容。这里是link。如果你能看到这里的关键部分
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
现在让我们看看contains 方法,它只是indexOf 方法的包装。 link。在 indexOf 方法中有一个 O(n) 操作。 (这里只注意一部分)
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
总之它是一个
O(n^2)
removeAll中的操作
选项 2 :
以前我在这里写过一些东西,但似乎我在某些时候错了,所以删除了它。最好听取专家关于 Hashset 的建议。我不确定在你的情况下 hashmap 是否会是一个更好的解决方案。所以我提出了另一种解决方案
选项3 :
第 1 步:如果您的数据已排序,则无需此步骤,否则对您要减去的列表进行排序(第二个列表)
第 2 步:对未排序列表的每个元素在第二个列表中运行二进制搜索
第 3 步:如果未找到匹配项,则存储在另一个结果列表中,但如果找到匹配项则不添加
第 4 步:结果列表是您的最终答案
选项 3 的成本:
第1步:如果没有排序O(nlogn)时间
第 2 步: O(nlogn) 时间
第三步:O(n)空格
**
所以总体 O(nlogn) 时间和 O(n) 空间
**