Monday, May 11, 2020

Heap&Tries Pengertian dan contoh


- Heap adalah complete binary tree (bukan binary search tree) yang mempunyai properties sebagai berikut:
          Min Heap:
-          Setiap node lebih kecil daripada child
          Max Heap:
-          Setiap node lebis besar daripada child
·           Min Heap :
- Setiap node lebih kecil dari masing-masing childnya
- Root merupakan node paling kecil, sedangkan node terbesar terletak pada leaf node

          Upheap in Min-Heap:
-Bandingkan nilai node  saat ini (mulai dengan node yang disisipkan) dengan nilai parent. Jika nilai node saat ini lebih kecil dari nilai parent daripada menukar nilainya dan teruskan upheap node induknya.
-Berhenti jika nilai parent lebih kecil dari nilai simpul saat ini atau node saat ini adalah root (tidak memiliki induk).

          Downheap in Min-Heap :
-Bandingkan nilai node saat ini (mulai dengan root) dengan nilai anak kiri dan kanannya. Tukar simpul saat ini dengan child terkecil dan lanjutkan downheap pada simpul (child) itu.
-Berhenti jika nilai simpul saat ini lebih kecil dari nilai child atau node saat ini adalah daun (tidak memiliki child).
·            Max Heap :
- Setiap node lebih besar dari masing-masing childnya
- Root merupakan node paling besar, sedangkan node terkecil terletak pada leaf node



Heap adalah implementasi efisien dari struktur data antrian prioritas.
1 .       find-min: cari elemen terkecil di heap.
2 .       insertion: masukkan elemen baru ke heap.
3 .       delete-min: hapus elemen terkecil dari heap.
(delete-min juga disebut pop, dan masukkan disebut push.)

  •           Heaps biasanya diimplementasikan dalam sebuah array.
  •       Elemen-elemen disimpan secara berurutan dari indeks 1 ke N dari atas ke bawah dan dari node kiri ke kanan tree.
  •           Root disimpan dalam indeks 1

(kami membiarkan indeks 0 kosong / tidak digunakan, untuk tujuan kenyamanan).

          - Biarkan indeks simpul saat ini menjadi x.
          - Setiap hubungan node dengan parents, left child dan right child dalam implementasi array dapat dihitung dengan mudah

- Parents (x) = x / 2
- Left Child (x) = 2 * x
- Right Child (x) = 2 * x + 1

Inilah mengapa menggunakan indeks 1 sebagai root, jika tidak hubungan tidak akan muncul sesederhana ini.


Contoh Coding Insertion and Delete
Delete :
#include <iostream>
  
using namespace std;
  
// To heapify a subtree rooted with node i which is
// an index in arr[]. N is size of heap
void heapify(int arr[], int n, int i)
{
    int largest = i; // Initialize largest as root
    int l = 2 * i + 1; // left = 2*i + 1
    int r = 2 * i + 2; // right = 2*i + 2
  
    // If left child is larger than root
    if (l < n && arr[l] > arr[largest])
        largest = l;
  
    // If right child is larger than largest so far
    if (r < n && arr[r] > arr[largest])
        largest = r;
  
    // If largest is not root
    if (largest != i) {
        swap(arr[i], arr[largest]);
  
        // Recursively heapify the affected sub-tree
        heapify(arr, n, largest);
    }
}
  
// Function to delete the root from Heap
void deleteRoot(int arr[], int& n)
{
    // Get the last element
    int lastElement = arr[n - 1];
  
    // Replace root with first element
    arr[0] = lastElement;
  
    // Decrease size of heap by 1
    n = n - 1;
  
    // heapify the root node
    heapify(arr, n, 0);
}
  
/* A utility function to print array of size n */
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
    cout << "\n";
}
  
// Driver Code
int main()
{
    // Array representation of Max-Heap
    // 10
    //    /  \
    // 5    3
    //  / \
    // 2   4
    int arr[] = { 10, 5, 3, 2, 4 };
  
    int n = sizeof(arr) / sizeof(arr[0]);
  
    deleteRoot(arr, n);
  
    printArray(arr, n);
  
    return 0;
}

Insertion :
#include <iostream>
using namespace std;
  
#define MAX 1000 // Max size of Heap
  
// Function to heapify ith node in a Heap
// of size n following a Bottom-up approach
void heapify(int arr[], int n, int i)
{
    // Find parent
    int parent = (i - 1) / 2;
  
    if (arr[parent] > 0) {
        // For Max-Heap
        // If current node is greater than its parent
        // Swap both of them and call heapify again
        // for the parent
        if (arr[i] > arr[parent]) {
            swap(arr[i], arr[parent]);
  
            // Recursively heapify the parent node
            heapify(arr, n, parent);
        }
    }
}
  
// Function to insert a new node to the Heap
void insertNode(int arr[], int& n, int Key)
{
    // Increase the size of Heap by 1
    n = n + 1;
  
    // Insert the element at end of Heap
    arr[n - 1] = Key;
  
    // Heapify the new node following a
    // Bottom-up approach
    heapify(arr, n, n - 1);
}
  
// A utility function to print array of size n
void printArray(int arr[], int n)
{
    for (int i = 0; i < n; ++i)
        cout << arr[i] << " ";
  
    cout << "\n";
}
  
// Driver Code
int main()
{
    // Array representation of Max-Heap
    // 10
    //    /  \
    // 5    3
    //  / \
    // 2   4
    int arr[MAX] = { 10, 5, 3, 2, 4 };
  
    int n = 5;
  
    int key = 15;
  
    insertNode(arr, n, key);
  
    printArray(arr, n);
    // Final Heap will be:
    // 15
    //    /   \
    // 5     10
    //  / \   /
    // 2   4 3
    return 0;
}



Min – Max Heap :
          Kondisi tumpukan bergantian antara level minimum dan maksimum ke level
-Setiap elemen pada level genap / ganjil lebih kecil dari semua anak-anaknya (level min).
-Setiap elemen pada level ganjil / genap lebih besar dari semua anak-anaknya (level maksimal).

  •           Tujuan dari tumpukan minimum adalah untuk memungkinkan kami menemukan elemen tumpukan terkecil dan terbesar sekaligus.
  •           Dalam tumpukan minimum,

-          Elemen terkecil terletak di root.
-          Elemen terbesar terletak di salah satu anak root (baik anak kiri / kanan).
Catatan: elemen terbesar mungkin terletak di root jika hanya ada satu elemen di heap.
          
  •       Upheap in  Min-Max Heap

          Jika node baru berada pada level min
- Jika induk node baru lebih kecil dari itu, maka tukarkan nilainya dan upheapmax dari parents.
- Selain itu upheapmin dari node baru
          Jika node baru berada pada level maksimal
-Jika parent node baru lebih besar dari itu, maka tukar nilainya dan upheapmin dari parent.
-Selain  itu upheapmax dari node baru

          - Upheapmin
Bandingkan nilai node saat ini dengan nilai grand-parent-nya. Jika nilai node saat ini lebih kecil dari nilai induknya maka tukar nilai-nilai mereka dan teruskan upheap min grand-parent.

         - Upheapmax
Bandingkan nilai node saat ini dengan nilai grand-parent-nya. Jika nilai node saat ini lebih besar dari nilai parent maka tukar nilai-nilai mereka dan teruskan upheap max grand-parent.

Tries :
Tries (prefix tree) adalah struktur data tree terurut yang digunakan untuk menyimpan array asosiatif (biasanya string)

Istilah TRIE berasal dari kata RETRIEVAL, karena mencoba dapat menemukan satu kata dalam kamus dengan hanya awalan kata.