2重List的for循环简单优化问题

先上代码

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)



 

猜你喜欢

转载自blog.csdn.net/pengjj1223/article/details/79468105