- packagecom.eshore.sweetop.exdataframe;
- /*
- *mark
- */
- publicclassFibHeap{
- privateFibNodemin;
- privateintcount;
- privateFibNoderoot;
- publicFibHeap(){
- root=newFibNode();
- root.setChild(null);
- root.setLeft(root);
- root.setRight(root);
- root.setDegree(0);
- root.setMark(false);
- root.setParent(null);
- }
- publicFibNodemin(){
- returnmin;
- }
- publicvoiddelete(FibNodenodex){
- decereaseKey(nodex,Integer.MIN_VALUE);
- extractMin();
- }
- publicvoiddecereaseKey(FibNodenodex,intk){
- if(nodex.getKey()<k){
- thrownewRuntimeException("newkeyisgreaterthancurrentkey");
- }
- nodex.setKey(k);
- FibNodenodey=nodex.getParent();
- if(nodey!=null&&nodex.getKey()<nodey.getKey()){
- cut(nodex,nodey);
- cascadingCut(nodey);
- }
- if(nodex.getKey()<min.getKey()){
- min=nodex;
- }
- }
- publicvoidcut(FibNodenodex,FibNodenodey){
- nodex.getLeft().setRight(nodex.getRight());
- nodex.getRight().setLeft(nodex.getLeft());
- nodey.setDegree(nodey.getDegree()-1);
- this.insertRoot(nodex);
- nodex.setParent(null);
- nodex.setMark(false);
- }
- publicvoidcascadingCut(FibNodenodey){
- FibNodenodez=nodey.getParent();
- if(nodez!=null){
- if(!nodey.getMark()){
- nodey.setMark(true);
- }else{
- cut(nodey,nodez);
- cascadingCut(nodez);
- }
- }
- }
- publicFibNodeextractMin(){
- FibNodenodez=min;
- if(nodez!=null){
- if(nodez.getDegree()!=0){
- FibNodefc=nodez.getChild();
- FibNodefn=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--;
- }
- returnnodez;
- }
- publicvoiddisplayRoot(){
- FibNodefr=root.getRight();
- while(fr!=root){
- System.out.println(fr.getKey());
- fr=fr.getRight();
- }
- }
- publicvoidconsolidate(){
- //this.displayRoot();
- FibNode[] a = new FibNode[(int)(Math.log(count)/Math.log(2))+1];//这一步比较难证明,下了些功夫
- FibNodenodew=root.getRight();
- //System.out.println("root:"+root.getKey());
- while(nodew!=root){
- FibNodenodex=nodew;
- //System.out.println(nodex.getKey());
- nodew=nodew.getRight();
- intd=nodex.getDegree();
- while(a[d]!=null){
- FibNodenodey=a[d];
- if(nodex.getKey()>nodey.getKey()){
- FibNodetemp=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(inti=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());
- }
- publicvoidlink(FibNodenodey,FibNodenodex){
- 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);
- }
- publicvoidinsert(FibNodenodex){
- 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++;
- }
- publicvoidunion(FibHeapheap){
- if(heap.count==0){
- return;
- }
- FibNodefn=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;
- }
- privatevoidinsertRoot(FibNodenodex){
- nodex.setLeft(root.getLeft());
- root.getLeft().setRight(nodex);
- nodex.setRight(root);
- root.setLeft(nodex);
- }
- publicstaticvoidmain(String[]args){
- FibHeapfh=newFibHeap();
- int[]keys={9,10,5,14,12,13,8,3};
- for(inti=0;i<keys.length;i++){
- FibNodefn=newFibNode();
- fn.setKey(keys[i]);
- fh.insert(fn);
- }
- //FibHeapfh2=newFibHeap();
- //int[]keys2={3,7,2,7,9,14,66};
- //for(inti=0;i<keys2.length;i++){
- //FibNodefn=newFibNode();
- //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());
- }
- }