一道算法题,请大佬解答一下
let a = [
{id:1,all:20}
{id:2,all:120}
{id:3,all:220}
{id:4,all:320}
]
let b = [
{id:1,bkk:230}
{id:2,bkk:12320}
{id:3,bkk:223420}
{id:4,bkk:323420}
]
let c = [
{id:1,v:??}
{id:2,v:??}
{id:3,v:??}
{id:4,v:??}
]
v=all/bkk
a,b数组内部有10w条 ,现在怎么生成c数组?用最少的遍历次数
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
最简单的情况
如果
a
和b
等长,而且按顺序一一对应,那就是一个循环的事情,非常简单为了做这个测试,我随机生成了各 10 万条数据
这是其中一次的输出(执行环境 Node.js 15)
复杂的情况
如果情况复杂一点,就是
a
和b
虽然有按 ID 一对一的数据,但是顺序可能不同……这种情况,先排个序也可以处理;这个处理过程简单,代码就不写了
更复杂的情况
或者
a
和b
压根就没有一对一的数据,中间可能缺那么两个 ID 什么的,但顺序是按 ID 从小到大来的,那可以用一个循环解决因为是有序的,所以这个思路是按顺序在两个列表中找,谁大谁等。某次执行的输出(根据 skips 的输出可以看到 id 是补齐了的)
再复杂一点的情况
还没完,上面都有假设条件。现在再复杂一点,两个列表中的数据无序,不保证一一对应,该怎么办?
我为以
a
的数据作为参照,从b
中去查,查到了就算结果出来放到c
中去,没查到就放弃。那么要查b
,可以遍历,也可以先从b
生成一个查找表bMap
,下面这段代码是用的查找表的办法执行结果,还好,速度很快
前面提到可以用遍历的方式来查找,那么改一下
map()
中查找bkk
的那一段这次的执行结果……就给个时间
30 毫秒和 17 秒(=17000毫秒),560 倍的差距……
结论
数据结构和算法真的要好好学!
数据结构和算法真的要好好学!
数据结构和算法真的要好好学!
如果a,b中的数据是一一对应的,那么遍历a或者b都行,一边就可以产生c。否则就要先遍历a或b进行数据收集,在遍历另一个进行运算。