【问题标题】:compare list with minimal time complexity in java在java中比较具有最小时间复杂度的列表
【发布时间】:2015-09-14 07:46:45
【问题描述】:

我有两个列表

List<MyData> listA = new ArrayList<MyData>()List<MyData> listB = new ArrayList<MyData>() 都包含 MyData 类型的对象,MyData 包含这些变量。

Class MyData {
    String name;
    boolean val
}

我必须编写一个程序来比较两个数组列表是否相等,时间复杂度更小。我没有覆盖 Mydata 类中的 equals 和 hashcode,因为它是一个已经存在的类,修改可能会影响应用程序的不同行为。 我写的代码是

forEach(MyData a:listA ){

    forEach(MyData b:listB ){
        if(a.getName.equals(b.getName)){
        }

    }
}

【问题讨论】:

  • 你能更好地定义 equal 吗?您是否希望项目在两个列表中的顺序相同,如果是这样,只需一个循环就足够了...
  • 如果两个列表大小相同,您实际上可以使用单循环进行迭代

标签: java algorithm arraylist


【解决方案1】:

首先forEach 不是有效的Java 语法。应该是for

其次,您不希望有一个嵌套循环,因为这会给您带来O(n^2) 时间复杂度。

你应该有一个循环遍历两个列表:

if (listA.size() != listB.size())
    return false;
for (int i = 0; i < listA.size(); i++){
    MyData a = listA.get(i);
    MyData b = listB.get(i);
    if (!a.getName.equals(b.getName))
        return false;
}
return true;

这会给你O(n) 时间复杂度。

【讨论】:

    【解决方案2】:

    双 foreach 循环会给您带来O(n^2) 的复杂性...这不是最佳选择。

    您的列表是否已排序?如果是这样,您可以一一进行比较(这很复杂O(n)) 如果没有,请对它们进行排序!最好的通用排序算法的复杂度为O(n.log(n))。所以总体而言,您将具有相同的复杂性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2015-08-24
      • 2013-06-06
      相关资源
      最近更新 更多