我建议我的大四学生使用下面代码的hashmap来匹配数据。我确信下面代码的复杂性是O(n * n),我认为使用散列这可能是线性的。谁能证实我是对的?假设presencePatients = 100000,fhirPatients = 10000,beds = 10000,departments = 5000
let filteredPatients = new Array();
presencePatient.forEach( patient => {
let fhir = fhirPatient.find((fhir)=>{
return ( fhir.pid === patient.id);
});
let beds = bedsInHospital.find( (bed) => {
return (bed.id === patient.bedId);
});
let deparmtment = departmentsInHospital.find( (deparmtment) => {
return (deparmtment.id === patient.icuId);
});
let obj = {
name : patient.name,
dob : patient.dateOfBirth,
gender : patient.gender,
email : patient.emailId,
maritialStatus : patient.maritialStatus,
mrn : patient.mrn,
contact : patient.phoneNumber,
bed : beds.name,
deparmtment : deparmtment.name
};
filteredPatients.push(obj);
});
答案 0 :(得分:5)
“更好”是一个主观的术语。
需要考虑的一些要点:
Map
或id
为患者,床位和部门键入的对象,一般按id
查找患者,病床和部门使用Map
/对象更快,而不是对这些数组进行线性搜索。Map
/对象会导致代码复杂性成本(主要问题)和额外的开销。 如果列出的代码存在性能问题,那么您可能会考虑Map
/对象查找(接受添加它以支持提高速度的成本)。但如果没有,可能会过早优化引入不必要的代码复杂性。
答案 1 :(得分:2)
@ T.J有很好的答案。克劳德。但是,我想就索引数据结构的有用性上限提出我的反对意见。
是。除了上述代码之外,在多个位置使用和修改源数据可能是正确的。更新索引辅助结构可能会提供额外的性能优势。但是这会给其他地方的代码带来额外的复杂性,这对于这个应用来说可能是不可接受的。
但是,我想指出上面的代码将会: 各种循环中的100 000 *(X fhirPatients + Y床+ Z部门)迭代。
另一方面,如果我们做索引传递,它将大致相当于: 6 *(X fhirPatients + Y床+ Z部门)
构建索引的成本非常便宜,因此,即使仅针对上述代码,也会显着加快速度!
需要提出的第二点是,对于大型计算重型代码,应使用高效的数据结构作为主要数据结构。因此,从数组到哈希映射的重构也许是一个很好的决定。如果数据使用更加复杂,那么引入轻量级或完整的内存和进程内数据库也有助于控制复杂性。