首先,我为回答太长而道歉。如果我有任何错误,您随时可以纠正我。在这里,我正在比较解决方案的一些选项
选项1 < ArrayList >:
在您的代码中,您使用了ArrayList.removeAll
方法,让我们看看removeAll的代码
removeAll的源代码
public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
}
所以需要知道batchRemove
方法中有什么。这里是链接。关键部分在于,如果您能看到
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
现在让我们看一下
contains
方法,它只是
indexOf
方法的一个包装器。
链接。在
indexOf
方法中,有一个O(n)的操作。(这里只是部分内容)
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
总体来说,这是一个
O(n^2)
在removeAll
中的操作
选项2 < HashSet >:以前我在这里写了一些东西,但似乎在某个地方我是错误的,所以删除了它。最好向专家寻求关于哈希集的建议。我不确定在你的情况下是否哈希映射将是更好的解决方案。所以我提出另一种解决方案
选项3 < 我的建议 您可以尝试 >:
步骤1:如果您的数据已排序,则无需此步骤,否则对要减去的列表进行排序
步骤2:对于未排序列表的每个元素,在第二个列表中运行二进制搜索
步骤3:如果没有找到匹配,则存储在另一个结果列表中,但如果找到匹配,则不添加
步骤4:结果列表是您的最终答案
选项3的成本:
步骤1:如果未排序,需要O(nlogn)
时间
步骤2:时间复杂度为O(nlogn)。
步骤3:空间复杂度为O(n)。
**
所以总体时间复杂度为O(nlogn),空间复杂度为O(n),保留HTML,不解释。
**