Javascript 我希望尽可能快地匹配来自流的请求

Javascript 我希望尽可能快地匹配来自流的请求,javascript,arrays,performance,stream,javascript-objects,Javascript,Arrays,Performance,Stream,Javascript Objects,我正在使用映射匹配传入的请求。我想在收到这些请求后尽快将它们与它们配对。顺序很重要,因为它是第一个来的,第一个匹配的。避免不必要的操作是一项要求。我的理解是散列映射比数组迭代快,并且映射保持顺序。什么是匹配流对象的最佳实现,而不需要太多的空间或时间复杂度?数据结构不是一成不变的,只要信息不丢失,就可以以任何优化的格式对其进行修改和编码。根据我的理解,能达到的最好结果是O(n)。我面临的另一个哈希问题是覆盖队列中的重复项。这就是我所拥有的 function*match(项目、标识、剩余=新映射(

我正在使用映射匹配传入的请求。我想在收到这些请求后尽快将它们与它们配对。顺序很重要,因为它是第一个来的,第一个匹配的。避免不必要的操作是一项要求。我的理解是散列映射比数组迭代快,并且映射保持顺序。什么是匹配流对象的最佳实现,而不需要太多的空间或时间复杂度?数据结构不是一成不变的,只要信息不丢失,就可以以任何优化的格式对其进行修改和编码。根据我的理解,能达到的最好结果是O(n)。我面临的另一个哈希问题是覆盖队列中的重复项。这就是我所拥有的

function*match(项目、标识、剩余=新映射()){
对于(让项目中的项目){
设id=标识(项目);
让pair=x=>({type:x.type==“乘客”?“驾驶员”:“乘客”,方向:x.direction,时间:x.time})
让key=item=>item.type+item.direction+item.time;
让候选者=剩余的.get(key(pair(id));
如果(候选人){
剩余。删除(密钥(对(id));
收益率[项目,候选];
}否则{
剩余。设置(键(id),项目);
}
}
}
//例如:
让项目=[{
类型:“驱动程序”,
方向:“东”,
时间:9:15,
姓名:[“阿奇博尔德·特朗普”]
},{ 
类型:“乘客”,
方向:“东”,
时间:9:15,
姓名:[“吃培根者”]
},{ 
类型:“乘客”,
方向:“东”,
时间:9:15,
姓名:[“班卓巴尼”]
},{ 
类型:“乘客”,
方向:“东”,
时间:9:15,
名称:[“脆弱的棍子”]
}, {
类型:“乘客”,
方向:“西”,
时间:9:30,
姓名:[“大红”]
},{
类型:“乘客”,
方向:“西”,
时间:9:35,
姓名:[“海瑟薇·安妮”]
}];
让剩余=新映射();
让配对=匹配(项目,项目=>项目,剩余);
log('pairs',…pairs);

console.log('remaining',…remaining.values())贴图比数组快。与每次在数组上循环相比,可以更快地访问映射键。下面是您使用地图的示例

var对=[];
var memo={};
功能对(项目){
var key=item.type.toString()+item.direction+item.time;
如果(备注[键]){
推(项);
删除备忘录[键];
}否则{
备注[键]=项目;
}
}
var-ar=[{
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:对,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}, {
类型:false,
方向:错,
时间:“9:00”
}];
为了(让它成为现实){
配对(it);
}
log('匹配对:',对);

log('剩余的不匹配对:',Object.values(memo))封装和空间复杂性:

您对
Set
的使用是适当的,但是可以通过封装匹配功能和去掉全局变量来改进代码。我建议使用以下生成器生成匹配对,并降低空间复杂度:
//将项目与第一个相等匹配:
函数*匹配(项,相等,剩余=新集合()){
项目:
对于(让项目中的项目){
对于(让剩余的候选人){
if(等于(项目、候选人)){
剩余。删除(候选人);
收益率[项目,候选];
继续项目;
}
}
剩余。添加(项目);
}
}
//例如:
设项=[1,2,5,3,3,4,2,1,4];
设剩余=新集合();
让配对=匹配(项目,(a,b)=>a==b,剩余);
console.log(…对);
console.log(…剩余)