Реализовать другой алгоритм, чтобы найти доминантный объект с несколькими параметрами в машинописи - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть профиль студента со значениями по нескольким предметам, таким как физика, химия и математика. Мне нужно найти список доминирующих студентов в зависимости от индивидуальной оценки по предметам. Например:

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_2 для всех параметров 2. student_1> student_2 хотя бы для одного параметра

Я попытался использовать вложенный цикл. Может быть, это алгоритм грубой силы. Я добавил еще один параметр с именем «пройден», чтобы отслеживать, доминирует ли он над другими. Вот код:


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 "пройден" == false. Теперь мне нужен тот же результат, используя разные алгоритмы, такие как «Разделяй и властвуй», «Ближайший сосед», «Разветвление и связывание» и т. Д. Или любые другие эффективные способы. Мне нужно сравнить алгоритмы сложности времени и пространства для больших наборов данных.

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете отсортировать массив, взяв ключи, получить дельту всех значений и нормализовать значение до [-1, 0, 1], используя 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);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...