实施不同算法以在打字稿中找到具有多个参数的显性对象

问题描述 投票:-1回答:1

我有一些学生的个人资料,其中包含物理,化学和数学等多个学科的价值。我需要根据各个学科的分数找到一份优势学生名单。例如:

let students = [{name: "A", phy: 70, chem: 80, math: 90},
              {name: "B", phy: 75, chem: 85, math: 60},
              {name: "C", phy: 78, chem: 81, math: 92},
              {name: "D", phy: 75, chem: 85, math: 55}]; 

如果一个学生满足以下两个条件,它将比另一个学生具有优势。1.所有参数的student_1> = Student_22.学生_1>学生_2的至少一个参数

我已经尝试过使用嵌套循环。可能是蛮力算法。我添加了另一个名为“ passed”的参数来跟踪它是否比其他参数更占优势。这是代码:


let students = [{ name: "A", phy: 70, chem: 80, math: 90, passed: true },
{ name: "B", phy: 75, chem: 85, math: 60, passed: true },
{ name: "C", phy: 78, chem: 81, math: 92, passed: true },
{ name: "D", phy: 75, chem: 85, math: 55, passed: true }];

let weak_student: any;

for (let student_1 of students) {

    if (student_1.passed == false ||
        students[students.length] === student_1) {
        continue;
    }

let compareList = students.filter(i => i.name != student_1.name && i.passed == true);

    for (let student_2 of compareList) {

        if ((student_1.phy >= student_2.phy &&
            student_1.chem >= student_2.chem &&
            student_1.math >= student_2.math)
            &&
            (student_1.phy > student_2.phy ||
                student_1.chem > student_2.chem ||
                student_1.math > student_2.math)
        ) {
            weak_student = students.find(i => i.name === student_2.name);
            weak_student.passed = false;

        } else if (student_1.phy < student_2.phy &&
            student_1.chem < student_2.chem &&
            student_1.math < student_2.math) {

            student_1.passed = false;
            break;
        }
    }
}
console.log(students);

我发现预期结果是学生A&D的标志“通过” ==否。现在,我需要使用不同的算法(例如“分而治之”,“最近的邻居”,“分支与边界”等)或任何其他有效方式来获得相同的结果。对于大型数据集,我需要在时间和空间复杂度的算法之间进行比较。

typescript algorithm nearest-neighbor divide-and-conquer branch-and-bound
1个回答
0
投票

您可以通过使用键对数组进行排序,获取所有值的差值,并通过使用[-1, 0, 1]将值归一化为Math.sign,对值求和并将此和作为排序结果返回。最高的群体是价值最大的群体。

Math.sign
let students = [{ name: "A", phy: 70, chem: 80, math: 90 }, { name: "B", phy: 75, chem: 85, math: 60 }, { name: "C", phy: 78, chem: 81, math: 92 }, { name: "D", phy: 75, chem: 85, math: 55 }];

students.sort((a, b) => ['phy', 'chem', 'math'].map(k => Math.sign(b[k] - a[k])).reduce((a, b) => a + b));

console.log(students);
© www.soinside.com 2019 - 2024. All rights reserved.