天天看点

如何从两个List中筛选出相同的值问题模型最简单的办法:遍历采用HashHash一定会比遍历快吗

如何从两个List中筛选出相同的值问题模型最简单的办法:遍历采用HashHash一定会比遍历快吗

现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证。

转换为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 &lt; m*n</code>。

从数据归纳法的角度,n必须大于2,不然即演变程<code>2m+2 &lt; 2m</code>。于是,当n&gt;2时:

结果是:

也就是说n&lt;=3的时候,遍历要比hash快。事实上还要更快,因为hash还需要创建更多的对象。然而,大部分情况下,n也就是第二个数组的长度是大于3的。这就是为什么说hash要更好写。当然,另一个很重要的原因是lambda stream的运算符号远比嵌套循环让人喜爱。

唯有不断学习方能改变!

-- <b>Ryan Miao</b>

继续阅读