Maison > interface Web > js tutoriel > le corps du texte

Tas | Implémentation de file d'attente prioritaire à l'aide de Javascript

WBOY
Libérer: 2024-08-21 12:32:33
original
637 Les gens l'ont consulté

Heap | Priority Queue Implementation using Javascript

Introduction

Un tas est une structure de données arborescente spéciale qui satisfait à la propriété tas.
Il s'agit d'un arbre binaire complet, ce qui signifie que tous les niveaux de l'arbre sont entièrement remplis à l'exception du dernier niveau, qui est rempli de gauche à droite.

Il existe deux types de tas :

  1. tas maximum
  2. min tas.

Tas maximum :

Dans un tas max, pour tout nœud I donné, la valeur de I est supérieure ou égale aux valeurs de ses enfants.
Cette propriété doit être vraie pour tous les nœuds de l'arborescence binaire. La valeur la plus élevée (maximale) se trouve à la racine de l'arbre.

Tas minimum :

Dans un tas min, pour tout nœud I donné, la valeur de I est inférieure ou égale aux valeurs de ses enfants.
Cette propriété doit être vraie pour tous les nœuds de l'arborescence binaire. La valeur la plus basse (minimum) se trouve à la racine de l'arbre.

Nous pouvons les appeler une file d'attente prioritaire car chaque fois que nous effectuons une opération d'insertion et de suppression, cela fera respectivement bubbleUp et bubbleDown.

On peut implémenter la même chose dans un tableau mais comment calculer les leftChildindex, rightChildIndex et parentIndex ?

Formule

Pour avoir un enfant

2i+1(gauche)
2i+2 (à droite)

Pour obtenir un parent

i-1/2

Ci-dessous, j'ai ajouté une implémentation de minHeap, veuillez vérifier.

class MinHeap {
    constructor() {
        this.data = [];
        this.length = 0;
    }

    insert(value) {
        this.data.push(value);
        this.length++;
        this.bubbleUp(this.length-1);
    }

    bubbleUp(index) {

        if (index == 0) {
            return ;
        }

        const parentIndex = this.getParentIndex(index);
        const parentValue = this.data[parentIndex];
        const value = this.data[index];

        if (parentValue > value) {
            this.data[parentIndex] = this.data[index];
            this.data[index] = parentValue;

            this.bubbleUp(parentIndex);
        }
    }

    getParentIndex(index) {
        return Math.floor((index-1)/2);
    }

    getLeftChildIndex(index) {
        return 2*index + 1;
    }

    getRightChildIndex(index) {
        return 2*index + 2;
    }

    bubbleDown(index) {
        if (index >= this.length) {
            return;
        }

        const lIndex = this.getLeftChildIndex(index);
        const rIndex = this.getRightChildIndex(index);

        const lValue = this.data[lIndex];
        const rValue = this.data[rIndex];
        const value = this.data[index];

        if (lValue < rValue && lValue < value) {
            // swap
            this.data[index] = this.data[lIndex];
            this.data[lIndex] = value;
            this.bubbleDown(lIndex);
        } else if (rValue < lValue && rValue < value) {
            this.data[index] = this.data[rIndex];
            this.data[rIndex] = value;
            this.bubbleDown(rIndex)
        }
    }

    delete() {
        if (this.length === 0) {
            return -1;
        }

        const out = this.data[0];
        if (this.length == 1) {
            this.data = [];
            this.length = 0;
            return out;
        }

        this.data[0] = this.data[this.length-1];
        this.length--;
        this.bubbleDown(0);
    }
}

const test = new MinHeap();

test.insert(50);
test.insert(100);
test.insert(101);
test.insert(20);
test.insert(110);
console.log(test)
test.delete();
console.log('---------After Delete -------')
console.log(test)
/*
MinHeap { data: [ 20, 50, 101, 100, 110 ], length: 5 }
---------After Delete -------
MinHeap { data: [ 50, 100, 101, 110, 110 ], length: 4 }
*/

Copier après la connexion

Faites-moi savoir si vous avez des questions, n'hésitez pas à vous connecter.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal