java - 查找列表是否包含另一个列表的每个元素的最佳优化方法是什么?

标签 java list time-complexity

我有两个列表:

List<String> firstList = new LinkedList<String>();
List<String> secondList = new LinkedList<String>();

我想知道一个列表的每个元素是否都包含在另一个列表中。 一个可能的解决方案是:

public boolean function(List<String> first, List<String> second)
{
first = firstList;
second = secondList
for (String item : firstList)
    {
            for (String elem : secondList)
            {
                if(elem.compareTo(item)!=0)
                return false;
            }
    }
 return true;
 }

正如我们所见,时间是二次方的。有没有办法做得更好?

最佳答案

您有一个 O(n*m) 的实现,需要 O(1) 的空间;您可以通过将第一个列表的元素添加到 HashSet<String> 来实现具有 O(m) 空间要求的 O(n+m) 实现,然后验证第二个列表的所有元素是否都存在:

Set<String> firstSet = new HashSet<String>(firstList);
for (String elem : secondList) {
    if(!firstSet.contains(item)) {
        return false;
    }
}
return true;

甚至更好

return new HashSet<>(firstList).containsAll(secondList);

(谢谢,bradimus!)

注意:您的方法使用次优比较机制:而不是调用 compareTo , 你可以调用 equals ,因为您不需要检查单词是按字母顺序排列在前面还是后面。

另一个问题是您的方法通常会返回 false什么时候应该返回 true ,因为你返回 false太早了。

关于java - 查找列表是否包含另一个列表的每个元素的最佳优化方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39575041/

相关文章:

java - 在检查之前声明循环限制有什么好处?

java - Tic-Tac-Toe 程序返回 java.lang.NullPointerException

c++ - 在初始化列表c++中初始化类数组

c# WPF 列表框 : n Lists, n 组

java - 如何降低 "put"函数的时间复杂度

java - 在构造函数中无效

c# - 从 TextBox 打印多页

java - 递归划分数组

arrays - 查找总和与给定值的距离最小的对/三元组

java - 在 Spring boot 中添加 catch block 的代码覆盖率