Montón sesgado

Un montón sesgado (o montón autoajustable) es una estructura de datos de montón implementada como un árbol binario . Los montones sesgados son ventajosos debido a su capacidad para fusionarse más rápidamente que los montones binarios. A diferencia de los montones binarios , no hay restricciones estructurales, por lo que no hay garantía de que la altura del árbol sea logarítmica. Solo se deben cumplir dos condiciones: 

  1. El orden general del almacenamiento dinámico debe estar allí (la raíz es mínima y lo mismo se cumple recursivamente para los subárboles), pero no se requiere la propiedad equilibrada (todos los niveles deben estar llenos excepto el último).
  2. La operación principal en Skew Heaps es Merge. Podemos implementar otras operaciones como insert, extractMin(), etc. usando solo Merge.

Ejemplo: 
1. Considere que el montón sesgado 1 es  

2. El segundo montón a considerar 

4. Y obtenemos el árbol fusionado final como 
 

Proceso de fusión recursivo: 
fusionar (h1, h2) 

  1. Sean h1 y h2 los montones sesgados de dos minutos que se fusionarán. Deje que la raíz de h1 sea más pequeña que la raíz de h2 (si no es más pequeña, podemos intercambiar para obtener la misma).
  2. Intercambiamos h1->izquierda y h1->derecha.
  3. h1->izquierda = fusionar(h2, h1->izquierda)

Ejemplos: 

Let h1 be
        10
     /    \
   20      30
  /        /
40        50

Let h2 be
       15
     /    \
   25      35
  /  \
45    55

After swapping h1->left and h1->right, we get
        10
     /    \
   30      20
  /        /
50        40

Now we recursively Merge
   30
   /     AND   
  50

       15
     /    \
   25      35
  /  \
45    55
After recursive merge, we get (Please do it 
using pen and paper).
        15
     /     \
   30        25
  /  \     /    \
35    50  45    55

We make this merged tree as left of original
h1 and we get following result.
             10
         /         \
       15           20
    /      \       /   
   30       25    40   
 /   \    /    \
35   40  45    55

Para visualización: https://www.cs.usfca.edu/~galles/JavascriptVisual/LeftistHeap.html 

CPP

// CPP program to implement Skew Heap
// operations.
#include <bits/stdc++.h>
using namespace std;
 
struct SkewHeap
{
    int key;
    SkewHeap* right;
    SkewHeap* left;
 
    // constructor to make a new
    // node of heap
    SkewHeap()
    {
        key = 0;
        right = NULL;
        left = NULL;
    }
 
    // the special merge function that's
    // used in most of the other operations
    // also
    SkewHeap* merge(SkewHeap* h1, SkewHeap* h2)
    {
        // If one of the heaps is empty
        if (h1 == NULL)
            return h2;
        if (h2 == NULL)
            return h1;
 
        // Make sure that h1 has smaller
        // key.
        if (h1->key > h2->key)
           swap(h1, h2);
 
        // Swap h1->left and h1->right
        swap(h1->left, h1->right);
 
        // Merge h2 and h1->left and make
        // merged tree as left of h1.
        h1->left = merge(h2, h1->left);
 
        return h1;
    }
 
    // function to construct heap using
    // values in the array
    SkewHeap* construct(SkewHeap* root,
                     int heap[], int n)
    {
        SkewHeap* temp;
        for (int i = 0; i < n; i++) {
            temp = new SkewHeap;
            temp->key = heap[i];
            root = merge(root, temp);
        }
        return root;
    }
 
    // function to print the Skew Heap,
    // as it is in form of a tree so we use
    // tree traversal algorithms
    void inorder(SkewHeap* root)
    {
        if (root == NULL)
            return;
        else {
            inorder(root->left);
            cout << root->key << "  ";
            inorder(root->right);
        }
        return;
    }
};
 
// Driver Code
int main()
{
    // Construct two heaps
    SkewHeap heap, *temp1 = NULL,
                   *temp2 = NULL;
    /*
            5
           / \
          /   \
         10   12    */
    int heap1[] = { 12, 5, 10 };
    /*
            3
           / \
          /   \
         7     8
        /
       /
      14    */
    int heap2[] = { 3, 7, 8, 14 };
    int n1 = sizeof(heap1) / sizeof(heap1[0]);
    int n2 = sizeof(heap2) / sizeof(heap2[0]);
    temp1 = heap.construct(temp1, heap1, n1);
    temp2 = heap.construct(temp2, heap2, n2);
 
    // Merge two heaps
    temp1 = heap.merge(temp1, temp2);
    /*
            3
           / \
          /   \
         5     7
        / \   /
       8  10 14
      /
     12    */
    cout << "Merged Heap is: " << endl;
    heap.inorder(temp1);
}
Producción: 

The heap obtained after merging is: 
12  8  5  10  3  14  7

 

Publicación traducida automáticamente

Artículo escrito por nickhilrawat y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *