第四周上:Priority Queue

4.1 Priority Queues

1. Priority Queues

  1. 区分:

    • Stack: 最后添加的item,最先被删(LIFO)
    • Queue:最早添加的item,最先被删(FIFO)
    • Randomized queue:随机删除一个item
    • Priority queue:删除最大(或最小)的item
  2. 思路:

    • Plan A :先不排序,insert后就放在序列尾;要remove时,找出最大的删除
    • Plan B:每insert一个,就按升序排一次序;要remove时,直接删除最后一个
  3. Performance

    implementation insert delMax max
    Plan A:Unordered array 1 N N
    Plan B:ordered array N 1 1
  4. Java Implementation(Plan A)

    public class UnorderedMaxPQ<Key extends Comparable<Key>>{
      private Key[] pq;  
      private int n;     // number of elements on pq
      
      // create an empty priority queue
      public UnorderedMaxPQ(int capacity){
        // no generic array creation
        pq = (Key[]) new Comparable[capacity];
      }
        
      // insert a key into the priority queue
      public void insert(Key v){
        pq[n++] = x;
      }
        
      // return and remove the largest key
      public Key delMax(){
        int max = 0;
        for(int i = 1; i < n; i++){
          if(less(pq, max, i)){
            max = i;
          }
        }
        exch(pq, max, n-1);
        return pq[--n];  // null out entry to prevent loitering
      }
      
      public Key max(){
        int max = 0;
        for(int i = 1; i < n; i++){
          if(less(pq, max, i)){
            max = i;
          }
        }
        return pq[max]; 
      }
      
      // is the priority queue empty?
      public boolean isEmpty(){
        return n == 0; 
      }
      
      private static boolean less(Comparable a, int i, int j){
         return a[i].CompareTo(a[j]) < 0;
     }
    
     private static void exch(Comparable[] a, int i, int j){
         Comparable swap = a[i];
         a[i] = a[j];
         a[j] = swap;
     }
    }
    

2. Binary heaps

  1. complete tree

    • 除了最底层,其他都完全对称

    • N个节点,高度:[lgN]

  2. 思路

    • Array代表了一个heap-ordered complete binary tree
      • heap-ordered complete binary tree
        • Keys在各个Nodes
        • Parent‘s key不能小于children’s key
      • Array
        • 让indices从1开始
        • Nodes按层排序
    • array[1]就是最大的key,即为binary tree的root
    • 对于array[k]
      • Parent: array[k/2]
      • Children: array[2k],array[2k+1]
  3. Performance

    implementation insert delMax max
    Plan A:Unordered array 1 N N
    Plan B:ordered array N 1 1
    Binary heap lgN lgN 1
  4. Java implementation

    public class MaxPQ<Key extends Comparable<Key>>{
     private Key[] pq;
     private int n;
    
     public MaxPQ(int capacity){
         pq = (Key[]) new Comparable[capacity+1]; // 因为我们假设从1开始,所以capacity需要+1
     }
    
     public boolean isEmpty(){
         return n == 0;
     }
    
     public void insert(Key key){ // at most 1+lgN compares
         pq[++n] = x;
         swim(n);
     }
    
     public Key delMax(){ // at most 2lgN compares
         Key max = pq[1];
         exch(1, n);
         sink(1);
         pq[n] = null;
         n--;
         return max;
     }
    
     // Child's key变得比它的parent‘s key大 
     private void swim(int k){
         while(k>1 && less(k/2, k)){
             exch(k/2, k);
             k = k/2;
         }
     }
    
     // Parent's key 变得比它的其中一个child或者比两个children都小
     private void sink(int k){
         while(2*k <= n){
             int j = 2*k;
             if(j < n && less(j, j+1)){ //找出两个children中较大的那个
                 j++;
             }
             if(!less(k, j)){// parent和较大的那个child比较
                 break;
             }
             exch(k, j);
             k = j;
         }
     }
    
     private static boolean less(int i, int j){
         return pq[i].CompareTo(pq[j]) < 0;
     }
    
     private static void exch(int i, int j){
         Key swap = pq[i];
         pq[i] = pq[j];
         pq[j] = swap;
     }
    }
    
    

3. Immutability

  1. immutable data type: 一旦创建,data type value不能改变

    • immutable:String, Integer,Double,Vector

      // can't override instance methods
      public final class Vector{
        // all instance variable private and final
        private final int n;
        private final double[] data;
        
        public Vector(double[] data){
          this.n = data.length;
          this.data = new double[n];
          for(int i = 0; i < n; i++){
            this.data[i] = data[i];
          }
        }
        
        // instance methods don't change instance variable
        ...
      }
      
  • mutable:StringBuilder,Stack,Counter,Java array

4. Heapsort

  1. 思路:

    • 开始有一个无序的array

    • 建一个有n个keys的max-heap(依然假设index是从1到n)

    • 不断地取出最大的key

  2. Performance

    • Heap construction : \leq 2N compares and exchanges
    • Heapsort: \leq 2N \lg N compares and exchanges
  3. Java implementation

    public class Heap{
     public static void sort(Comparable[] a){ // 假设 array 0 到 1
         int n = a.length;
         for(int k = k/2; k >=1; k--){
             sink(a, k, n);
         }
         while(n > 1){
             exch(a, 1, n);
             sink(a, 1, --n);
         }
     }
    
     private static void sink(Comparable[] a, int k, int n){
         while(2*k <= n){
             int j = 2*k;
             if(j < n && less(a, j, j+1)){ //找出两个children中较大的那个
                 j++;
             }
             if(!less(a, k, j)){// parent和较大的那个child比较
                 break;
             }
             exch(a, k, j);
             k = j;
         }
     }
    
     private static boolean less(Comparable[] a, int i, int j){ // 注意:是1-based indexing
         return a[i-1].CompareTo(a[j-1]) < 0; 
     }
    
     private static void exch(Comparable[] a, int i, int j){ // // 注意:是1-based indexing
         Key swap = pq[i-1];
         pq[i-1] = pq[j-1];
         pq[j-1] = swap;
     }
    }
    
  1. 总结(Sorting algorithms)

    inplace? stable? worst average best remarks
    selection N^2 / 2 N^2 / 2 N^2 / 2 N exchanges
    insertion N^2 / 2 N^2 / 4 N 适用small N或partially ordered
    shell ? ? N code少
    quick N^2 / 2 2N \lg N N \lg N N \lg N probabilistic guarantee(用shuffle),fastes in practice
    3-way quick N^2 / 2 2N \lg N N 对quicksort的改良,适用于有很多duplicate keys
    merge N \lg N N \lg N N \lg N N \lg N guarantee,stable
    heap 2N \lg N 2N \lg N N \lg N N \lg N guarantee,inplace
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271

推荐阅读更多精彩内容

  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 6,701评论 0 9
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,097评论 0 2
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,077评论 3 52
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,510评论 0 89
  • 堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆), 堆可以...
    9527Roy阅读 584评论 0 0