先上代码
package com.springstudy.test; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test4 { public static void main(String[] args) { List<Student> a = new ArrayList<>(); List<Student> b = new ArrayList<>(); Student a1 = new Student("001", "001"); // Student a4 = new Student("001", "001"); Student a2 = new Student("002", "002"); Student a3 = new Student("003", "003"); Student b1 = new Student("011", "001"); Student b2 = new Student("012", "002"); Student b3 = new Student("013", "003"); a.add(a1); a.add(a2); a.add(a3); b.add(b1); b.add(b2); b.add(b3); for(Student aa : a){ for(Student bb : b){ if(aa.name.equals(bb.name)){ System.out.println("*"); } } } } } class Student{ String id; String name; public Student(String id , String name ){ this.id = id; this.name = name ; } }
2个list长度分别为n,m,2重for循环,他的时间复杂度O(n*m)
但是,如果要优化,怎么做
代码如下
//优化 Set<String> seta = new HashSet<>(); for(Student aa : a ){ seta.add(aa.name); } for(Student bb : b){ if(seta.contains(bb.name)){ System.out.println("&"); } }
原理讲解:
1将List a的name属性 转换为 HashSet
2遍历list b 判断b的name属性是否在set里
第一步,时间复杂度O(n)
第二步,由于Hash被设计为时间复杂度为O(0),所以只是遍历b的时间复杂度O(m)
结果 上述内容的时间复杂度为O(n+m)