- package com.eshore.sweetop.exdataframe;
- /*
- * mark
- */
- public class FibHeap {
- private FibNode min;
- private int count;
- private FibNode root;
- public FibHeap() {
- root = new FibNode();
- root.setChild(null);
- root.setLeft(root);
- root.setRight(root);
- root.setDegree(0);
- root.setMark(false);
- root.setParent(null);
- }
- public FibNode min() {
- return min;
- }
- public void delete(FibNode nodex){
- decereaseKey(nodex,Integer.MIN_VALUE);
- extractMin();
- }
- public void decereaseKey(FibNode nodex, int k) {
- if (nodex.getKey() < k) {
- throw new RuntimeException("new key is greater than current key");
- }
- nodex.setKey(k);
- FibNode nodey = nodex.getParent();
- if (nodey != null && nodex.getKey() < nodey.getKey()) {
- cut(nodex,nodey);
- cascadingCut(nodey);
- }
- if (nodex.getKey() < min.getKey()) {
- min = nodex;
- }
- }
- public void cut(FibNode nodex,FibNode nodey){
- nodex.getLeft().setRight(nodex.getRight());
- nodex.getRight().setLeft(nodex.getLeft());
- nodey.setDegree(nodey.getDegree()-1);
- this.insertRoot(nodex);
- nodex.setParent(null);
- nodex.setMark(false);
- }
- public void cascadingCut(FibNode nodey){
- FibNode nodez=nodey.getParent();
- if(nodez!=null){
- if(!nodey.getMark()){
- nodey.setMark(true);
- }else{
- cut(nodey,nodez);
- cascadingCut(nodez);
- }
- }
- }
- public FibNode extractMin() {
- FibNode nodez = min;
- if (nodez != null) {
- if (nodez.getDegree() != 0) {
- FibNode fc = nodez.getChild();
- FibNode fn = fc;
- do {
- fn.setParent(null);
- fn = fn.getRight();
- } while (fn != fc);
- nodez.getLeft().setRight(fc.getRight());
- fc.getRight().setLeft(nodez.getLeft());
- nodez.getRight().setLeft(fc);
- fc.setRight(nodez.getRight());
- } else {
- nodez.getLeft().setRight(nodez.getRight());
- nodez.getRight().setLeft(nodez.getLeft());
- }
- if (nodez == nodez.getRight()) {
- min = null;
- } else {
- min = min.getRight();
- consolidate();
- }
- count--;
- }
- return nodez;
- }
- public void displayRoot() {
- FibNode fr = root.getRight();
- while (fr != root) {
- System.out.println(fr.getKey());
- fr = fr.getRight();
- }
- }
- public void consolidate() {
- // this.displayRoot();
- FibNode[] a = new FibNode[(int)(Math.log(count)/Math.log(2))+1];//这一步比较难证明,下了些功夫
- FibNode nodew = root.getRight();
- // System.out.println("root:" + root.getKey());
- while (nodew != root) {
- FibNode nodex = nodew;
- // System.out.println(nodex.getKey());
- nodew = nodew.getRight();
- int d = nodex.getDegree();
- while (a[d] != null) {
- FibNode nodey = a[d];
- if (nodex.getKey() > nodey.getKey()) {
- FibNode temp = nodex;
- nodex = nodey;
- nodey = temp;
- }
- link(nodey, nodex);
- a[d] = null;
- d++;
- }
- a[d] = nodex;
- }
- // this.displayRoot();
- min = null;
- // root = null;
- // System.out.println("a===============");
- for (int i = 0; i < a.length; i++) {
- if (a[i] != null) {
- // root = a[i];
- if (min == null || a[i].getKey() < min.getKey()) {
- min = a[i];
- }
- }
- }
- // System.out.println("new:"+min.getKey());
- }
- public void link(FibNode nodey, FibNode nodex) {
- nodey.getLeft().setRight(nodey.getRight());
- nodey.getRight().setLeft(nodey.getLeft());
- nodey.setParent(nodex);
- if (nodex.getDegree() == 0) {
- nodex.setChild(nodey);
- nodey.setLeft(nodey);
- nodey.setRight(nodey);
- } else {
- nodey.setLeft(nodex.getChild().getLeft());
- nodex.getChild().getLeft().setRight(nodey);
- nodey.setRight(nodex.getChild());
- nodex.getChild().setLeft(nodey);
- }
- nodex.setDegree(nodex.getDegree() + 1);
- nodey.setMark(false);
- }
- public void insert(FibNode nodex) {
- nodex.setDegree(0);
- nodex.setParent(null);
- nodex.setChild(null);
- nodex.setLeft(nodex);
- nodex.setRight(nodex);
- nodex.setMark(false);
- insertRoot(nodex);
- if (min == null || nodex.getKey() < min.getKey()) {
- min = nodex;
- }
- count++;
- }
- public void union(FibHeap heap) {
- if (heap.count == 0) {
- return;
- }
- FibNode fn = heap.root;
- fn.getRight().setLeft(root.getLeft());
- root.getLeft().setRight(fn.getRight());
- fn.getLeft().setRight(root);
- root.getLeft().setLeft(fn);
- if (min == null || heap.min.getKey() < min.getKey()) {
- min = heap.min;
- }
- this.count += heap.count;
- }
- private void insertRoot(FibNode nodex) {
- nodex.setLeft(root.getLeft());
- root.getLeft().setRight(nodex);
- nodex.setRight(root);
- root.setLeft(nodex);
- }
- public static void main(String[] args) {
- FibHeap fh = new FibHeap();
- int[] keys = { 9, 10, 5, 14, 12, 13, 8, 3 };
- for (int i = 0; i < keys.length; i++) {
- FibNode fn = new FibNode();
- fn.setKey(keys[i]);
- fh.insert(fn);
- }
- // FibHeap fh2=new FibHeap();
- // int[] keys2 = { 3,7,2,7,9,14,66};
- // for (int i = 0; i < keys2.length; i++) {
- // FibNode fn=new FibNode();
- // fn.setKey(keys2[i]);
- // fh2.insert(fn);
- // }
- // fh.union(fh2);
- // System.out.println(fh.min().getKey());
- // fh.displayRoot();
- // System.out.println("min:" + fh.extractMin().getKey());
- // System.out.println("min:" + fh.extractMin().getKey());
- // System.out.println("min:" + fh.extractMin().getKey());
- fh.delete(fh.min());
- System.out.println(fh.min().getKey());
- }
- }
算法之斐波那契堆
最新推荐文章于 2020-07-17 11:49:39 发布