zoukankan      html  css  js  c++  java
  • heap知识点

    heapify unsorted array: n*logn -> o(n):  最贵的 o(logn) 操作集中在少数几个node 上

    heapify: 从下往上,从右往左, 从第一个internal node 开始往下 PUSH

    8 (2)
    /
    5 4 (2) (8) (4)
    / /
    6 7 9 2 (4) (8)

    4->2 8->2 8->4 : 堆序性 时间复杂度 O(N)


    但heapify 并不是 sort, 左右并没有排序,如果需要排序的话,需要先heapify 然后再 一个一个的poll 时间复杂度是 on + onlogn = onlogn 

     

     1 public class MyPriorityQueue {
     2     /*
     3     Heap: 不管谁先进去,最小的先出来 实现通过 PriorityQueue
     4     binary heap: 堆序性 满树性  所有ITEM  的 REF 存在一个数组里, OBJECT 分散存的
     5     offer: 加入气泡位置满足满树性,然后往上一层的NODE翻 满足堆序性 o(LOGN)
     6     peek: 每次操作堆顶元素 o(1)
     7     poll: 1: 删除堆顶元素-1,2)把最后一个元素 4 放入堆顶-满足满树的性质, 3) 然后和左右比较大小往下PUSH-调整堆序性质 2 和 4 互换位置  o(LOGN)
     8           1
     9        /   
    10       3     2
    11      /    /
    12    5   7   4
    13 
    14      poll peek size isEmpty()
    15     * */
    16     public static void main(String[] args) {
    17         Queue<Integer> pq = new PriorityQueue<>() ;
    18         pq.offer(3);
    19         pq.offer(1);
    20         pq.offer(2);
    21         System.out.println(pq.poll());//1
    22         System.out.println(pq.poll()); //2
    23 
    24     }
    25 
    26     /*
    27     https://stackoverflow.com/questions/1871253/updating-java-priorityqueue-when-its-elements-change-priority
    28     You have to remove and re-insert, as the queue works by putting new elements in the appropriate position when they are inserted
    29     * */
    30     @Test
    31     public void pqUpdate_wrong(){
    32         //have to pass in comparator, otherwise the pq dont know how to order node obj.
    33         Queue<Node> pq = new PriorityQueue<>(new MyComparator()) ;
    34         Node n1 = new Node(3) ;
    35         Node n2 = new Node(1);
    36         Node n3 = new Node(2);
    37         pq.offer(n1);
    38         pq.offer(n2);
    39         pq.offer(n3);
    40         n2.val = 100 ;
    41         System.out.println(pq.poll().val); //100: the ref order stays the same
    42         //pq只在 OFFER 的时候才会更新顺序
    43     }
    44 
    45     @Test
    46     public void pqUpdate_correct(){
    47         //have to pass in comparator, otherwise the pq dont know how to order node obj.
    48         Queue<Node> pq = new PriorityQueue<>(new MyComparator()) ;
    49         Node n1 = new Node(3) ;
    50         Node n2 = new Node(1);
    51         Node n3 = new Node(2);
    52         pq.offer(n1);
    53         pq.offer(n2);
    54         pq.offer(n3);
    55         n2.val = 100 ; //o(1)
    56         pq.remove(n2);//remove 的时间复杂度是 o(n): binary heap 是无序 所以需要遍历来寻找, 找到之后 POLL 然后堆序性 O(LOGN): O(N)+O(LOGN) =O(N)
    57         pq.offer(n2) ;//o(logn)
    58         System.out.println(pq.poll().val);//2
    59     }
    60 
    61     /*
    62  heapify: 从下往上,从右往左, 从第一个internal node 开始往下 PUSH
    63 
    64          8  (2)
    65        /   
    66       5      4  (2) (8) (4)
    67      /     /  
    68     6  7   9    2 (4)   (8)
    69 
    70     4->2   8->2   8->4 : 堆序性 时间复杂度 O(N)
    71     * */
    72 }
    73 
    74 class Node{
    75     int val ;
    76     public Node(int val) {
    77         this.val = val;
    78     }
    79 }
    80 
    81 class MyComparator implements Comparator<Node>{
    82     @Override
    83     public int compare(Node n1, Node n2) {
    84         if (n1.val<n2.val){
    85             return -1 ;
    86         } else if(n1.val == n2.val){
    87             return 0;
    88         } else {
    89             return 1 ;
    90         }
    91         //the following could result Integer overflow
    92         //return n1.val - n2.val ;
    93     }
    94 }

     Priority Queue 时间复杂度分析:

     

    .offer:

     .offer:

  • 相关阅读:
    第五:Nutanix的Prism管理手册
    第四:Nutanix的开关机步骤
    Exchange2016DR(异地容灾)环境:重要
    博客的开始
    sql查询日期型内容+oracle
    expdp导出oracle数据库中指定表空间下数据
    oracle 锁表的解决sql语句(pl/sql 删除表中数据锁表)
    centos 关闭防火墙+开启ssh服务
    显示桌面 我的电脑
    查看电脑连接过的wifi—通过命令行
  • 原文地址:https://www.cnblogs.com/davidnyc/p/8507090.html
Copyright © 2011-2022 走看看