JavaScript >> Javascript-Tutorial >  >> Tags >> map

Wann HashMap anstelle von Loop Part 2 verwendet werden sollte

Im vorherigen Artikel Wann man HashMap anstelle von Loop verwenden sollte, habe ich besprochen, wie HashMap anstelle einer Schleife effektiv sein könnte oder filtern

In diesem Teil 2 diskutieren wir einen praktischen Anwendungsfall, bei dem HashMap angewendet wird.

Ein praktischer Anwendungsfall

Gegebene Nutzer und Aufgaben , hat jeder Benutzer genau eine Aufgabe. Das Ziel ist es, Benutzer nach Aufgaben zu gruppieren .
Stellen Sie sich vor, es gibt n Benutzer und t Aufgaben, und Sie müssen Benutzer basierend auf den Aufgaben gruppieren. Als Ausgabe hat jede Aufgabe eine Liste von Benutzern, denen die Aufgabe zugewiesen ist.

Eingabe

  • Benutzer:[ {id: 101, name: "Josh", taskId: 10}]
  • Aufgaben:[ {id: 10, title: "Clean House"} ]

Ausgabe :{ 10 => [ { id: 101, name: 'Josh', taskId: 10 } ] }

Verwendung von Arrays

const users = [
    {id: 101, name: "Josh", taskId: 10},
    {id: 102, name: "Mosh", taskId: 10},
    {id: 103, name: "Eli", taskId: 11},
    {id: 104, name: "Jad", taskId: 12},
    {id: 105, name: "Susan", taskId: 12}
];

const tasks = [
    {id: 10, title: "Clean House"},
    {id: 11, title: "Deploy App"},
    {id: 12, title: "Learn Coding"}
]

let usersByTask = new Map();

for(let i = 0; i < users.length; i++){
    let user = users[i];
    for(let j = 0; j < tasks.length; j++){
        let task = tasks[j];
        if(task.id === user.taskId){
            if(usersByTask.has(task.id)){
                usersByTask.get(task.id).push(user);
            }
            else{
                usersByTask.set(task.id, [user]);
            }
            break;
        }
    }
}
console.log(usersByTask)

In der obigen Lösung untersuchen wir alle Aufgaben für jeden Benutzer, um festzustellen, ob die Aufgabe dem Benutzer gehört. Zeitkomplexität ist O(n*t) wo n und t sind die Anzahl der Benutzer bzw. Aufgaben.

Identifizierung des Engpasses

Warum sollte HashMap in Betracht gezogen werden?

Wenn Sie genau hinsehen, suchen wir unnötig nach Aufgaben; Beachten Sie, dass wir auf alle Benutzer zugreifen müssen, sodass die erste Schleife nicht optimiert werden kann (da wir nach allen Benutzern suchen müssen)

Is there a better way to find which task a user belongs to without visiting all the tasks?

Ja da ist! Stellen Sie die Aufgaben als HashMap statt als Array dar. Task id will be the key, and task object will be the value. Das bedeutet, dass ein gegebener Benutzer u , können wir die Aufgabe finden, die zu u gehört ohne alle Aufgaben zu besuchen.

Eine bessere Lösung

const users = [
    {id: 101, name: "Josh", taskId: 10},
    {id: 102, name: "Mosh", taskId: 10},
    {id: 103, name: "Eli", taskId: 11},
    {id: 104, name: "Jad", taskId: 12},
    {id: 105, name: "Susan", taskId: 12}
];

const tasks = new Map();
tasks.set(10, {id: 10, title: "Clean House"});
tasks.set(11, {id: 11, title: "Deploy App"});
tasks.set(12, {id: 12, title: "Learn Coding"});

let usersByTask = new Map();
for(let i = 0; i < users.length; i++){
    let user = users[i];
    let taskId = user.taskId;
    if(usersByTask.has(taskId)){
        usersByTask.get(taskId).push(user);
    }
    else{
        usersByTask.set(taskId, [user]);
    }
}
console.log(usersByTask)

Sobald wir den Engpass identifiziert haben , der Engpass war repeatedly searching tasks.

Wir haben den Engpass behoben indem Aufgaben in einer HashMap statt im Array gespeichert werden.

Wenn Sie ein Anfänger bei HashMap sind, ermutige ich Sie, den Code zu lesen und zu verstehen und geduldig zu sein.

Fazit :HashMap ist sehr praktisch. Sobald Sie den Engpass bei der Suche in einer Liste oder einem Array identifiziert haben, besteht der nächste Schritt darin, das Array für einen schnellen Zugriff in eine HashMap zu konvertieren.

Überprüfen Sie den ersten Teil, wenn Sie dies nicht getan haben.
Wann man HashMap anstelle von Loop verwendet

Das ist es. Wenn Sie dies hilfreich fanden, wenden Sie sich bitte an Twitter @kaleemniz