算法之斐波那契堆

  1. package com.eshore.sweetop.exdataframe;
  2. /*
  3.  * mark
  4.  */
  5. public class FibHeap {
  6.     private FibNode min;
  7.     private int count;
  8.     private FibNode root;
  9.     public FibHeap() {
  10.         root = new FibNode();
  11.         root.setChild(null);
  12.         root.setLeft(root);
  13.         root.setRight(root);
  14.         root.setDegree(0);
  15.         root.setMark(false);
  16.         root.setParent(null);
  17.     }
  18.     public FibNode min() {
  19.         return min;
  20.     }
  21.     
  22.     public void delete(FibNode nodex){
  23.         decereaseKey(nodex,Integer.MIN_VALUE);
  24.         extractMin();
  25.     }
  26.     public void decereaseKey(FibNode nodex, int k) {
  27.         if (nodex.getKey() < k) {
  28.             throw new RuntimeException("new key is greater than current key");
  29.         }
  30.         nodex.setKey(k);
  31.         FibNode nodey = nodex.getParent();
  32.         if (nodey != null && nodex.getKey() < nodey.getKey()) {
  33.             cut(nodex,nodey);
  34.             cascadingCut(nodey);
  35.         }
  36.         if (nodex.getKey() < min.getKey()) {
  37.             min = nodex;
  38.         }
  39.     }
  40.     
  41.     public void cut(FibNode nodex,FibNode nodey){
  42.         nodex.getLeft().setRight(nodex.getRight());
  43.         nodex.getRight().setLeft(nodex.getLeft());
  44.         nodey.setDegree(nodey.getDegree()-1);
  45.         this.insertRoot(nodex);
  46.         nodex.setParent(null);
  47.         nodex.setMark(false);
  48.     }
  49.     
  50.     public void cascadingCut(FibNode nodey){
  51.         FibNode nodez=nodey.getParent();
  52.         if(nodez!=null){
  53.             if(!nodey.getMark()){
  54.                 nodey.setMark(true);
  55.             }else{
  56.                 cut(nodey,nodez);
  57.                 cascadingCut(nodez);
  58.             }
  59.         }
  60.     }
  61.     public FibNode extractMin() {
  62.         FibNode nodez = min;
  63.         if (nodez != null) {
  64.             if (nodez.getDegree() != 0) {
  65.                 FibNode fc = nodez.getChild();
  66.                 FibNode fn = fc;
  67.                 do {
  68.                     fn.setParent(null);
  69.                     fn = fn.getRight();
  70.                 } while (fn != fc);
  71.                 nodez.getLeft().setRight(fc.getRight());
  72.                 fc.getRight().setLeft(nodez.getLeft());
  73.                 nodez.getRight().setLeft(fc);
  74.                 fc.setRight(nodez.getRight());
  75.             } else {
  76.                 nodez.getLeft().setRight(nodez.getRight());
  77.                 nodez.getRight().setLeft(nodez.getLeft());
  78.             }
  79.             if (nodez == nodez.getRight()) {
  80.                 min = null;
  81.             } else {
  82.                 min = min.getRight();
  83.                 consolidate();
  84.             }
  85.             count--;
  86.         }
  87.         return nodez;
  88.     }
  89.     public void displayRoot() {
  90.         FibNode fr = root.getRight();
  91.         while (fr != root) {
  92.             System.out.println(fr.getKey());
  93.             fr = fr.getRight();
  94.         }
  95.     }
  96.     public void consolidate() {
  97.         // this.displayRoot();
  98.         FibNode[] a = new FibNode[(int)(Math.log(count)/Math.log(2))+1];//这一步比较难证明,下了些功夫
  99.         FibNode nodew = root.getRight();
  100.         // System.out.println("root:" + root.getKey());
  101.         while (nodew != root) {
  102.             FibNode nodex = nodew;
  103.             // System.out.println(nodex.getKey());
  104.             nodew = nodew.getRight();
  105.             int d = nodex.getDegree();
  106.             while (a[d] != null) {
  107.                 FibNode nodey = a[d];
  108.                 if (nodex.getKey() > nodey.getKey()) {
  109.                     FibNode temp = nodex;
  110.                     nodex = nodey;
  111.                     nodey = temp;
  112.                 }
  113.                 link(nodey, nodex);
  114.                 a[d] = null;
  115.                 d++;
  116.             }
  117.             a[d] = nodex;
  118.         }
  119.         // this.displayRoot();
  120.         min = null;
  121.         // root = null;
  122.         // System.out.println("a===============");
  123.         for (int i = 0; i < a.length; i++) {
  124.             if (a[i] != null) {
  125.                 // root = a[i];
  126.                 if (min == null || a[i].getKey() < min.getKey()) {
  127.                     min = a[i];
  128.                 }
  129.             }
  130.         }
  131.         // System.out.println("new:"+min.getKey());
  132.     }
  133.     public void link(FibNode nodey, FibNode nodex) {
  134.         nodey.getLeft().setRight(nodey.getRight());
  135.         nodey.getRight().setLeft(nodey.getLeft());
  136.         nodey.setParent(nodex);
  137.         if (nodex.getDegree() == 0) {
  138.             nodex.setChild(nodey);
  139.             nodey.setLeft(nodey);
  140.             nodey.setRight(nodey);
  141.         } else {
  142.             nodey.setLeft(nodex.getChild().getLeft());
  143.             nodex.getChild().getLeft().setRight(nodey);
  144.             nodey.setRight(nodex.getChild());
  145.             nodex.getChild().setLeft(nodey);
  146.         }
  147.         nodex.setDegree(nodex.getDegree() + 1);
  148.         nodey.setMark(false);
  149.     }
  150.     public void insert(FibNode nodex) {
  151.         nodex.setDegree(0);
  152.         nodex.setParent(null);
  153.         nodex.setChild(null);
  154.         nodex.setLeft(nodex);
  155.         nodex.setRight(nodex);
  156.         nodex.setMark(false);
  157.         insertRoot(nodex);
  158.         if (min == null || nodex.getKey() < min.getKey()) {
  159.             min = nodex;
  160.         }
  161.         count++;
  162.     }
  163.     public void union(FibHeap heap) {
  164.         if (heap.count == 0) {
  165.             return;
  166.         }
  167.         FibNode fn = heap.root;
  168.         fn.getRight().setLeft(root.getLeft());
  169.         root.getLeft().setRight(fn.getRight());
  170.         fn.getLeft().setRight(root);
  171.         root.getLeft().setLeft(fn);
  172.         if (min == null || heap.min.getKey() < min.getKey()) {
  173.             min = heap.min;
  174.         }
  175.         this.count += heap.count;
  176.     }
  177.     private void insertRoot(FibNode nodex) {
  178.         nodex.setLeft(root.getLeft());
  179.         root.getLeft().setRight(nodex);
  180.         nodex.setRight(root);
  181.         root.setLeft(nodex);
  182.     }
  183.     public static void main(String[] args) {
  184.         FibHeap fh = new FibHeap();
  185.         int[] keys = { 910514121383 };
  186.         for (int i = 0; i < keys.length; i++) {
  187.             FibNode fn = new FibNode();
  188.             fn.setKey(keys[i]);
  189.             fh.insert(fn);
  190.         }
  191.         // FibHeap fh2=new FibHeap();
  192.         // int[] keys2 = { 3,7,2,7,9,14,66};
  193.         // for (int i = 0; i < keys2.length; i++) {
  194.         // FibNode fn=new FibNode();
  195.         // fn.setKey(keys2[i]);
  196.         // fh2.insert(fn);
  197.         // }
  198.         // fh.union(fh2);
  199.         // System.out.println(fh.min().getKey());
  200.         // fh.displayRoot();
  201. //      System.out.println("min:" + fh.extractMin().getKey());
  202. //      System.out.println("min:" + fh.extractMin().getKey());
  203. //      System.out.println("min:" + fh.extractMin().getKey());
  204.         
  205.         fh.delete(fh.min());
  206.         System.out.println(fh.min().getKey());
  207.     }
  208. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值