【问题标题】:which code is better? [closed]哪个代码更好? [关闭]
【发布时间】:2018-03-27 10:19:39
【问题描述】:

我建议我的上级使用下面代码中的 hashmap 来匹配数据。我确信下面代码的复杂度是 O(n*n),我认为使用散列可以是线性的。你们中的任何人都可以验证我是否正确吗?假设存在Patients = 100000,fhirPatients = 10000,beds = 10000 和部门 = 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);
});

【问题讨论】:

  • 你建议的代码是什么?
  • 很大程度上取决于数据。在某些情况下,设置某种查找的开销可能是不可取的。我敢打赌,除非你在一个巨大的数据集上运行它,否则它并不重要。另外,为什么不使用map()
  • 代码审查应该发布在codereview.stackexchange.com - 这就是你的问题会被很多人否决的原因(不是我 - 我不是在抨击新手)。
  • @Hexodus OP 成为会员一年多了,现在应该知道规则了 - 不是菜鸟,但如果你问一个版本是否比另一个更好,你应该发布两个版本吗?
  • @Pete 你是对的,但我严格按照他的名声来判断......

标签: javascript arrays algorithm


【解决方案1】:

“更好”是一个主观术语。

需要考虑的几点:

  • 是的,如果您有一个Map 或一个由id 为患者、床位和科室键入的对象,通常使用id 查找患者、床位和科室会更快使用Map /object 而不是对这些数组进行线性搜索。
  • 但是,假设您的代码的其他部分也需要数组,同时维护数组和 Map/object 会产生代码复杂性(主要问题)和额外开销的成本。
  • 只有当数组很大时,线性搜索才会有问题。

如果列出的代码存在性能问题,那么您可以考虑使用Map/object 查找(接受添加它以提高速度的成本)。但如果没有,则可能是过早的优化引入了不必要的代码复杂性。

【讨论】:

  • 感谢回复,这是一个庞大的数据集,有超过100000个患者的数据。
  • 哦,这是 T.J 的回答,甚至在阅读之前就给它投票吧:)
  • @MohammadUsman: :-) 但请不要,我经常出错。幸运的是人们让我知道(通过 cmets 和/或投票),所以我可以修复它。
  • @shashikantdwivedi 那是 100 000 名患者 * X fhirPatients * Y 病床 * Z 部门。最好将其添加到您的问题中(并提供一些粗略估计 X/Y/Z 值)
  • @T.J.Crowder 好的,我会尝试,但我不会做出承诺 :)
【解决方案2】:

@T.J. 的回答很好。克劳德。但是,我想就索引数据结构的有用性上限提出我的不同意见。

是的。除了上述代码之外,源数据可能在多个地方被使用和修改。更新索引辅助结构可能确实可以提供额外的性能优势。但这会给其他地方的代码带来额外的复杂性,这对于这个应用程序来说可能是不可接受的折衷。

但是,我想指出上面的代码可以: 100 000 * (X fhirPatients + Y 个病床 + Z 个部门) 在各种循环中迭代。

另一方面,如果我们进行索引传递,它大致相当于: 6 *(X fhirPatients + Y 病床 + Z 科室)

构建索引的成本非常低廉,因此,即使只为上述代码完成,也会大大加快速度!

需要提出的第二点是,对于大型计算量大的代码,应该使用高效的数据结构作为主要结构。所以也许从数组重构到哈希图是一个不错的决定。如果数据使用更加复杂,那么引入轻量级或完整的内存和进程内数据库也将有助于控制复杂性。

【讨论】:

  • “@T.J. Crowder 给出了很好的回答。但是我想提出我的不同意见......” 我的回答并不是说你不应该使用索引结构。我概述了成本并指出如果速度是一个已知问题,使用它们会有所帮助。
  • 希望我的回答能提供一些提示,即在使用模式更复杂时如何处理索引。这就是为什么我在那里添加“上限”;)
  • 希望是的。您关于即使您每次都必须建立索引的观点是否正确,取决于 OP 使用该数字(presentPatientsfhirPatients)和其他值谈论的“患者”。可悲的是,他/她没有填写我们的信息。 :-)
  • 嗯。如果 (X + Y +Z) 很小,它应该没有帮助。
猜你喜欢
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2014-07-26
  • 2010-11-06
  • 2021-05-30
相关资源
最近更新 更多