先上代码
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)