zoukankan      html  css  js  c++  java
  • dataStructure@ Implementation of minimal heap

    A binary heap is a heap data struc­ture cre­ated using a binary tree.

    binary tree has two rules -

    1. Binary Heap has to be com­plete binary tree at all lev­els except the last level. This is called shape prop­erty.
    2. All nodes are either greater than equal to (Max-Heap) or less than equal to (Min-Heap) to each of its child nodes. This is called heap prop­erty.

    Imple­men­ta­tion:

    • Use array to store the data.
    • Start stor­ing from index 1, not 0.
    • For any given node at posi­tion i:
    • Its Left Child is at [2*i] if available.
    • Its Right Child is at [2*i+1] if available.
    • Its Par­ent Node is at [i/2]if avail­able.
    Max-Heap    Min-Heap

     Heap Majorly has 3 operations -

    1. Insert Oper­a­tion
    2. Delete Oper­a­tion
    3. Extract-Min (OR Extract-Max)

    Insert Oper­a­tion:

    • Add the ele­ment at the bot­tom leaf of the Heap.
    • Per­form the Bubble-Up operation.
    • All Insert Oper­a­tions must per­form the bubble-up oper­a­tion(it is also called as up-heap, percolate-up, sift-up, trickle-up, heapify-up, or cascade-up)

    Bubble-up Oper­a­tion:

    • If inserted ele­ment is smaller than its par­ent node in case of Min-Heap OR greater than its par­ent node in case of Max-Heap, swap the ele­ment with its parent.
    • Keep repeat­ing the above step, if node reaches its cor­rect posi­tion, STOP.
    Insert() - Bubble-Up Min-Heap

    Insert() — Bubble-Up Min-Heap

    Extract-Min OR Extract-Max Operation:

    • Take out the ele­ment from the root.( it will be min­i­mum in case of Min-Heap and max­i­mum in case of Max-Heap).
    • Take out the last ele­ment from the last level from the heap and replace the root with the element.
    • Per­form Sink-Down
    • All delete oper­a­tion must per­form Sink-Down Oper­a­tion ( also known as bubble-down, percolate-down, sift-down, trickle down, heapify-down, cascade-down).

    Sink-Down Oper­a­tion:

    • If replaced ele­ment is greater than any of its child node in case of Min-Heap OR smaller than any if its child node in case of Max-Heap, swap the ele­ment with its small­est child(Min-Heap) or with its great­est child(Max-Heap).
    • Keep repeat­ing the above step, if node reaches its cor­rect posi­tion, STOP.
    Delete OR Extract Min from Heap

    Delete OR Extract Min from Heap

    Delete Oper­a­tion:

    • Find the index for the ele­ment to be deleted.
    • Take out the last ele­ment from the last level from the heap and replace the index with this element .
    • Per­form Sink-Down

    Time and Space Complexity:

    Space O(n)
    Search O(n)
    Insert O(log n)
    Delete O(log n)
    package data_structure_testing;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    
    public class MinHeap {
    
        public ArrayList<Integer> minheap = null;
        
        public MinHeap() {    
            this.minheap = new ArrayList<Integer> ();
            this.minheap.add(Integer.MIN_VALUE);
            /**
             * -------------------------------------------------------------------------
             * Integer.MIN_VALUE |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
             * -------------------------------------------------------------------------
             */
        }
        
        public void swap(int i, int j) {
            if(i == j)  return;
            int tmp = minheap.get(i);
            minheap.set(i, minheap.get(j));
            minheap.set(j, tmp);
        }
        
        public int getSize() {
            return minheap.size();
        }
        
        public int parent(int i) {
            return i/2;
        }
        
        public int leftChild(int i) {
            return i*2;
        }
        
        public int rightChild(int i) {
            return i*2 + 1;
        }
        
        public void offer(int x) {
            
            minheap.add(x);
            int position = minheap.size() - 1;
            bubbleUp(position);
        }
        
        public void bubbleUp(int position) {
            
            int pa = parent(position);
            if(pa != 0 && minheap.get(position) < minheap.get(pa)) {
                swap(position, pa);
                bubbleUp(pa);
            }
        }
        
        public int peek() {
            if(getSize() == 1) {
                System.out.println("the min heap is empty!");
                return minheap.get(0);
            } else{
                return minheap.get(1);
            }
        }
        
        public void pushDown(int i) {
            
            int min_position = i, min_value = minheap.get(i);
            int lc = leftChild(i), rc = lc + 1;
            
            if(lc >= getSize()) {
                return;
            }
            
            if(lc < getSize()) {
                if(minheap.get(lc) < min_value) {
                    min_position = lc;
                    min_value = minheap.get(lc);
                }
                if(rc < getSize() && minheap.get(rc) < min_value) {
                    min_position = rc;
                }
            }
            
            swap(min_position, i);
            if(min_position != i) {
                pushDown(min_position);
            }
        }
        
        public int poll() {
            if(getSize() == 1) {
                System.out.println("since the min heap is empty, so we cannot poll any element from it!");
                return minheap.get(0);
            }
            
            int top = minheap.get(1);
            swap(1, getSize()-1);
            minheap.remove(getSize()-1);
            
            if(getSize() > 1) {
                pushDown(1);
            }
            
            return top;
        }
        
        public static void main(String[] args) {
            
            MinHeap minheap = new MinHeap();
            
            minheap.offer(5);
            minheap.offer(4);
            minheap.offer(2);
            minheap.offer(4);
            minheap.offer(3);
            
            System.out.println(minheap.poll());
            System.out.println(minheap.poll());
            System.out.println(minheap.poll());
            System.out.println(minheap.poll());
            System.out.println(minheap.poll());
            System.out.println(minheap.poll());
    
        }
    
    }
    min heap
  • 相关阅读:
    多线程编程1-定义理解与三种实现方式
    Java类集框架详细汇总-底层分析
    Trie、并查集、堆、Hash表学习过程以及遇到的问题
    spring前导知识-Tomcat、Maven等配置
    双指针、位运算、离散化、区间合并的手动模拟
    单点登录原理与简单实现
    Spring引入外部配置文件
    Java异常机制
    Java多线程-线程的概念和创建
    java webservice服务器端获取request对象的三种方式
  • 原文地址:https://www.cnblogs.com/fu11211129/p/5628651.html
Copyright © 2011-2022 走看看