现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证。
转换为List socialList,和List idList,从二者中找出匹配的社保卡。
创建社保卡类
创建身份证类
只要做两轮循环即可。
准备初始化数据:
遍历
很容易看出,时间复杂度O(m,n)=m*n.
通过观察发现,两个list取相同的部分时,每次都遍历两个list。那么,可以把判断条件放入Hash中,判断hash是否存在来代替遍历查找。
如此,假设hash算法特别好,hash的时间复杂度为O(n)=n。如此推出这种做法的时间复杂度为O(m,n)=2m+n. 当然,更重要的是这种写法更让人喜欢,天然不喜欢嵌套的判断,喜欢扁平化的风格。
想当然的以为,hash肯定会比遍历快,因为是hash啊。其实,可以算算比较结果。比较什么时候<code>2m+n < m*n</code>。
从数据归纳法的角度,n必须大于2,不然即演变程<code>2m+2 < 2m</code>。于是,当n>2时:
结果是:
也就是说n<=3的时候,遍历要比hash快。事实上还要更快,因为hash还需要创建更多的对象。然而,大部分情况下,n也就是第二个数组的长度是大于3的。这就是为什么说hash要更好写。当然,另一个很重要的原因是lambda stream的运算符号远比嵌套循环让人喜爱。
唯有不断学习方能改变!
-- <b>Ryan Miao</b>