zoukankan      html  css  js  c++  java
  • 第6章 优先队列(堆)

    优先队列(堆)

     1 public class BinaryHeap<AnyType extends Comparable<? super AnyType>>
     2 {
     3     public BinaryHeap(){ this(DEFAULT_CAPACITY); }
     4     public BinaryHeap(int capacity)
     5     {
     6         currentSize = 0;
     7         array = (AnyType [])new Comparable[capacity + 1];
     8     }
     9 
    10     public BinaryHeap(AnyType[] items)
    11     {
    12         currentSize = items.length;
    13         array = (AnyType[])new Comparable[(currentSize + 2) * 11 / 10];
    14 
    15         int i = 1;
    16         for (AnyType item : items)
    17             array[i++] = item;
    18         buildHeap();
    19     }
    20 
    21     public void insert(AnyType x)
    22     {
    23         if (currentSize == array.length - 1)
    24             enlargeArray(array.length * 2 + 1);
    25 
    26         int hole = ++currentSize;
    27         for (array[0] = x; x.compareTo(array[hole / 2]) < 0; hole /= 2)
    28             array[hole] = array[hole / 2];
    29         array[hole] = x;
    30     }
    31 
    32     private void enlargeArray(int newSize)
    33     {
    34         AnyType[] old = array;
    35         array = (AnyType[])new Comparable[newSize];
    36         for (int i = 0; i < old.length; i++)
    37             array[i] = old[i];
    38     }
    39 
    40     public AnyType findMin()
    41     {
    42         if (isEmpty())
    43             throw new UnderflowException();
    44         return array[1];
    45     }
    46 
    47     public AnyType deleteMin()
    48     {
    49         if (isEmpty())
    50             throw new UnderflowException();
    51         AnyType minItem = findMin();
    52         array[1] = array[currentSize--];
    53         percolateDown(1);
    54 
    55         return minItem;
    56     }
    57 
    58     private void buildHeap()
    59     {
    60         for (int i = currentSize / 2; i > 0; i--)
    61             percolateDown(i);
    62     }
    63 
    64     public boolean isEmpty(){ return currentSize == 0; }
    65 
    66     public void makeEmpty(){ currentSize = 0; }
    67 
    68     private static final int DEFAULT_CAPACITY = 10;
    69 
    70     private int currentSize;
    71     private AnyType[] array;
    72 
    73     private void percolateDown(int hole)
    74     {
    75         int child;
    76         AnyType tmp = array[hole];
    77         for (; hole * 2 <= currentSize; hole = child)
    78         {
    79             child = hole * 2;
    80             if (child != child && array[child + 1].compareTo(array[child]) < 0)
    81                 child++;
    82             if (array[child].compareTo(tmp) < 0)
    83                 array[hole] = array[child];
    84             else
    85                 break;
    86         }
    87         array[hole] = tmp;
    88     }
    89 }

    左式堆

     1 public class LeftistHeap<AnyType extends Comparable<? super AnyType>>
     2 {
     3     public LeftistHeap()
     4     { root = null; }
     5     
     6     public void merge(LeftistHeap<AnyType>rhs)
     7     {
     8         if (this == null)
     9             return;
    10         root = merge(root, rhs.root);
    11         rhs.root  = null;
    12     }
    13     
    14     private Node<AnyType>merge(Node<AnyType>h1, Node<AnyType>h2)
    15     {
    16         if (h1 == null)
    17             return h2;
    18         if (h2 == null)
    19             return h1;
    20         if (h1.element.compareTo(h2.element) < 0) 
    21             return merge1(h1,h2);
    22         else
    23             return merge1(h2, h1);
    24     }
    25     
    26    private Node<AnyType>merge1(Node<AnyType>h1, Node<AnyType>h2)
    27    {
    28        if (h1.left == null) 
    29            h1.left = h2;
    30        else 
    31        {
    32            h1.right = merge(h1.right, h2);
    33            if (h1.left.npl < h1.right.npl)
    34                swapChildren(h1);
    35            h1.npl = h1.right.npl + 1;
    36        }
    37        return h1;
    38    }
    39    
    40    private static <AnyType> void swapChildren(Node<AnyType> t)
    41    {
    42        Node<AnyType> tmp = t.left;
    43        t.left = t.right;
    44        t.right = tmp;
    45    }
    46    
    47    public void insert(AnyType x){ root = merge(new Node<>(x), root); }
    48    
    49    public AnyType findMin()
    50    {
    51        if (isEmpty())
    52            throw new UnderflowException();
    53        return root.element;
    54    }
    55    
    56    public AnyType deleteMin()
    57    {
    58        if (isEmpty())
    59            throw new UnderflowException();
    60        
    61        AnyType minItem = root.element;
    62        root = merge(root.left, root.right);
    63        
    64        return minItem;
    65    }
    66    
    67    public boolean isEmpty()
    68    { return root == null; }
    69    public void makeEmpty()
    70    { root = null; }
    71     
    72    private static class Node<AnyType>
    73    {
    74        Node(AnyType theElement)
    75        { this(theElement,null,null); }
    76        
    77        Node(AnyType theElement, Node<AnyType>lt, Node<AnyType>rt)
    78        { element = theElement; left = lt; right = rt; npl = 0; }
    79        
    80        AnyType element;
    81        Node<AnyType> left;
    82        Node<AnyType> right;
    83        int npl;
    84    }
    85    
    86    private Node<AnyType> root;
    87 }

    二项队列

      1 public class BinomialQueue<AnyType extends Comparable<? super AnyType>>
      2 {
      3     public BinomialQueue()
      4     {
      5         theTrees = new BinNode[DEFAULT_TREES];
      6         makeEmpty();
      7     }
      8 
      9     public BinomialQueue(AnyType item)
     10     {
     11         currentSize = 1;
     12         theTrees = new BinNode[1];
     13         theTrees[0] = new BinNode<>(item, null, null);
     14     }
     15 
     16     private void expaneTheTrees(int newNumTrees)
     17     {
     18         BinNode<AnyType>[] old = theTrees;
     19         int oldNumTrees = theTrees.length;
     20 
     21         theTrees = new BinNode[newNumTrees];
     22         for (int i = 0; i < Math.min(oldNumTrees, newNumTrees); i++)
     23             theTrees[i] = old[i];
     24         for (int i = oldNumTrees; i < newNumTrees; i++)
     25             theTrees[i] = null;
     26     }
     27     
     28     public void merge(BinomialQueue<AnyType>rhs)
     29     {
     30         if (this == rhs)
     31             return;
     32         
     33         currentSize += rhs.currentSize;
     34         
     35         if (currentSize > capacity())
     36         {
     37             int newNumTrees = Math.max(theTrees.length, rhs.theTrees.length) + 1;
     38             expaneTheTrees(newNumTrees);
     39         }
     40         
     41         BinNode<AnyType>carry = null;
     42         for (int i = 0, j = 1; j <= currentSize; i++,j *= 2)
     43         {
     44             BinNode<AnyType>t1 = theTrees[i];
     45             BinNode<AnyType>t2 = i < rhs.theTrees.length ? rhs.theTrees[i] : null;
     46             
     47             int whichCase = t1 == null ? 0 : 1;
     48             whichCase += t2 == null ? 0 : 2;
     49             whichCase += carry == null ? 0 : 4;
     50             
     51             switch (whichCase)
     52             {
     53                 case 0:
     54                 case 1:
     55                     break;
     56                 case 2:
     57                     theTrees[i] = t2;
     58                     rhs.theTrees[i] = null;
     59                     break;
     60                 case 4:
     61                     theTrees[i] = carry;
     62                     carry = null;
     63                     break;
     64                 case 3:
     65                     carry = combineTrees(t1, t2);
     66                     theTrees[i] = rhs.theTrees[i] = null;
     67                     break;
     68                 case 5:
     69                     carry = combineTrees(t1, carry);
     70                     theTrees[i] = null;
     71                     break;
     72                 case 6:
     73                     carry = combineTrees(t2, carry);
     74                     theTrees[i] = null;
     75                     break;
     76                 case 7:
     77                     theTrees[i] = carry;
     78                     carry = combineTrees(t1, t2);
     79                     rhs.theTrees[i] = null;
     80                     break;
     81             }
     82         }
     83         for (int k = 0; k < rhs.theTrees.length; k++)
     84             rhs.theTrees[k] = null;
     85         rhs.currentSize = 0;
     86     }
     87     
     88     private BinNode<AnyType> combineTrees(BinNode<AnyType>t1, BinNode<AnyType>t2)
     89     {
     90         if (t1.element.compareTo(t2.element) > 0)
     91             return combineTrees(t2, t1);
     92         t2.nextSibling = t1.leftChild;
     93         t1.leftChild = t2;
     94         return t1;
     95     }
     96     
     97     public void insert(AnyType x){ merge(new BinomialQueue<>(x)); }
     98     
     99     public AnyType findMin()
    100     {
    101         if (isEmpty())
    102             throw new UnderflowException();
    103         
    104         return theTrees[findMinIndex()].element;
    105     }
    106     
    107     private int findMinIndex()
    108     {
    109         int i;
    110         int minIndex;
    111         
    112         for (i = 0; theTrees[i] == null; i++)
    113             ;
    114         for (minIndex = i; i < theTrees.length; i++)
    115             if (theTrees[i] != null && theTrees[i].element.compareTo(theTrees[minIndex].element) < 0 )
    116                 minIndex = i;
    117             
    118         return minIndex;
    119     }
    120     
    121     private AnyType deleteMin()
    122     {
    123         if (isEmpty())
    124             throw new UnderflowException();
    125         
    126         int minIndex = findMinIndex();
    127         AnyType minItem = theTrees[minIndex].element;
    128         
    129         BinNode<AnyType>deletedTree = theTrees[minIndex].leftChild;
    130         
    131         BinomialQueue<AnyType>deletedQueue = new BinomialQueue<>();
    132         deletedQueue.expaneTheTrees(minIndex);
    133         
    134         deletedQueue.currentSize = (1 << minIndex ) - 1;
    135         
    136         for (int j = minIndex - 1; j >= 0; j--)
    137         {
    138             deletedQueue.theTrees[j] = deletedTree;
    139             deletedTree = deletedTree.nextSibling;
    140             deletedQueue.theTrees[j].nextSibling = null;
    141         }
    142         
    143         theTrees[minIndex] = null;
    144         currentSize -= deletedQueue.currentSize - 1;
    145         
    146         merge(deletedQueue);
    147         
    148         return minItem;
    149     }
    150 
    151     public boolean isEmpty(){ return currentSize == 0; }
    152 
    153     public void makeEmpty()
    154     {
    155         currentSize = 0;
    156         for (int i = 0; i < theTrees.length; i++)
    157             theTrees[i] = null;
    158     }
    159 
    160     private static class BinNode<AnyType>
    161     {
    162         BinNode(AnyType theElement)
    163         { this(theElement, null, null); }
    164         BinNode(AnyType theElement, BinNode<AnyType>lt, BinNode<AnyType>nt)
    165         { element = theElement; leftChild = lt; nextSibling = nt; }
    166 
    167         AnyType element;
    168         BinNode<AnyType> leftChild;
    169         BinNode<AnyType> nextSibling;
    170     }
    171 
    172     private static final int DEFAULT_TREES = 1;
    173 
    174     private int currentSize;
    175     private BinNode<AnyType>[] theTrees;
    176 
    177     private int capacity(){ return ( 1 << theTrees.length ) - 1; }
    178 }
  • 相关阅读:
    求逆序对的解法
    关于宽搜BFS广度优先搜索的那点事
    大数乘法 poj2389
    二分求幂(快速求幂,二进制求幂)
    2n皇后问题
    poj2406 Power Strings (kmp 求最小循环字串)
    poj1050查找最大子矩阵和
    二叉树的建立和遍历
    已知二叉树前序和中序,求二叉树。
    c/c++连接mysql数据库设置及乱码问题(vs2013连接mysql数据库,使用Mysql API操作数据库)
  • 原文地址:https://www.cnblogs.com/tjj-love-world/p/10563225.html
Copyright © 2011-2022 走看看