算法之二项堆

来源:互联网 发布:儿童读物在线阅读软件 编辑:程序博客网 时间:2024/05/17 08:10
  1. package com.eshore.sweetop.exdataframe;
  2. public class BinomialHeap {
  3.     private BinomialNode head;
  4.     public BinomialNode getHead() {
  5.         return head;
  6.     }
  7.     private void setHead(BinomialNode head) {
  8.         this.head = head;
  9.     }
  10.     public BinomialNode min() {
  11.         BinomialNode nodey = null;
  12.         BinomialNode nodex = head;
  13.         int min = Integer.MAX_VALUE;
  14.         while (nodex != null) {
  15.             if (nodex.getKey() < min) {
  16.                 min = nodex.getKey();
  17.                 nodey = nodex;
  18.             }
  19.             nodex = nodex.getSibling();
  20.         }
  21.         return nodey;
  22.     }
  23.     public void link(BinomialNode nodey, BinomialNode nodez) {
  24.         nodey.setParent(nodez);
  25.         nodey.setSibling(nodez.getChild());
  26.         nodez.setChild(nodey);
  27.         nodez.setDegree(nodez.getDegree() + 1);
  28.     }
  29.     public void union(BinomialHeap h2) {
  30.         this.setHead(merge(this, h2));
  31.         BinomialNode px = null;
  32.         BinomialNode x = this.getHead();
  33.         BinomialNode nx = x.getSibling();
  34.         while (nx != null) {
  35.             if (x.getDegree() != nx.getDegree()
  36.                     || (nx.getSibling() != null && nx.getSibling().getDegree() == x
  37.                             .getDegree())) {
  38.                 px = x;
  39.                 x = nx;
  40.             } else if (x.getKey() <= nx.getKey()) {
  41.                 x.setSibling(nx.getSibling());
  42.                 link(nx, x);
  43.             } else {
  44.                 if (px == null) {
  45.                     this.setHead(nx);
  46.                 } else {
  47.                     px.setSibling(nx);
  48.                 }
  49.                 link(x, nx);
  50.                 x = nx;
  51.             }
  52.             nx = x.getSibling();
  53.         }
  54.     }
  55.     public void insert(BinomialNode x) {
  56.         BinomialHeap h = new BinomialHeap();
  57.         x.setParent(null);
  58.         x.setChild(null);
  59.         x.setSibling(null);
  60.         x.setDegree(0);
  61.         h.setHead(x);
  62.         union(h);
  63.     }
  64.     public BinomialNode merge(BinomialHeap h1, BinomialHeap h2) {
  65.         BinomialNode head1 = h1.getHead();
  66.         BinomialNode head2 = h2.getHead();
  67.         BinomialNode nd = new BinomialNode();
  68.         BinomialNode node = nd;
  69.         while (!(head1 == null && head2 == null)) {
  70.             if (head1 == null) {
  71.                 node.setSibling(head2);
  72.                 head2 = head2.getSibling();
  73.             } else if (head2 == null) {
  74.                 node.setSibling(head1);
  75.                 head1 = head1.getSibling();
  76.             } else {
  77.                 if (head1.getDegree() < head2.getDegree()) {
  78.                     node.setSibling(head1);
  79.                     head1 = head1.getSibling();
  80.                 } else {
  81.                     node.setSibling(head2);
  82.                     head2 = head2.getSibling();
  83.                 }
  84.             }
  85.             node = node.getSibling();
  86.         }
  87.         return nd.getSibling();
  88.     }
  89.     public BinomialNode extractMin() {
  90.         BinomialNode nodep = null;
  91.         BinomialNode nodey = null;
  92.         BinomialNode nodex = head;
  93.         BinomialNode nodeyp = null;
  94.         int min = Integer.MAX_VALUE;
  95.         while (nodex != null) {
  96.             if (nodex.getKey() < min) {
  97.                 min = nodex.getKey();
  98.                 nodey = nodex;
  99.                 nodeyp = nodep;
  100.             }
  101.             nodep = nodex;
  102.             nodex = nodex.getSibling();
  103.         }
  104.         if (nodey != null) {
  105.             if (nodeyp == null) {
  106.                 this.setHead(nodey.getSibling());
  107.             } else {
  108.                 nodeyp.setSibling(nodey.getSibling());
  109.             }
  110.             BinomialHeap h1 = new BinomialHeap();
  111.             BinomialNode nd=nodey.getChild();
  112.             nodey.setChild(null);
  113.             BinomialNode[] nds=new BinomialNode[nodey.getDegree()];
  114.             int i=0;
  115.             while(nd!=null){
  116.                 nd.setParent(null);
  117.                 nds[i]=nd;
  118.                 nd=nd.getSibling();
  119.                 i++;
  120.             }
  121.             
  122.             for (int j = 0; j < nds.length-1; j++) {
  123.                 nd=nds[nds.length-1-j];
  124.                 nd.setSibling(nds[nds.length-2-j]);
  125.             }
  126.             nds[0].setSibling(null);
  127.             h1.setHead(nds[nds.length-1]);
  128.             this.union(h1);
  129.         }
  130.         return nodey;
  131.     }
  132.     public void decreaseKey(BinomialNode nodex,int k){
  133.         if(k>nodex.getKey()){
  134.             throw new RuntimeException();
  135.         }
  136.         nodex.setKey(k);
  137.         BinomialNode nodey=nodex;
  138.         BinomialNode nodez=nodey.getParent();
  139.         while(nodez!=null && nodey.getKey()<nodez.getKey()){
  140.             int temp=nodey.getKey();
  141.             nodey.setKey(nodez.getKey());
  142.             nodez.setKey(temp);
  143.             nodey=nodez;
  144.             nodez=nodey.getParent();
  145.         }
  146.     }
  147.     
  148.     public void delete(BinomialNode nodex){
  149.         decreaseKey(nodex,Integer.MIN_VALUE);
  150.         extractMin();
  151.     }
  152.     
  153.     public static void main(String[] args) {
  154.         BinomialHeap bh = new BinomialHeap();
  155.         int[] keys = { 910514138 ,15,12,11,7,22,6};
  156.         BinomialNode node=null;
  157.         for (int i = 0; i < keys.length; i++) {
  158.             BinomialNode bn = new BinomialNode();
  159.             bn.setKey(keys[i]);
  160.             bh.insert(bn);
  161.             node=bn;
  162.         }
  163.         bh.delete(node);
  164.         System.out.println(bh.extractMin().getKey());
  165.         System.out.println(bh.extractMin().getKey());
  166.     }
  167. }
原创粉丝点击