- packagecom.eshore.sweetop.exdataframe;
- publicclassBinomialHeap{
- privateBinomialNodehead;
- publicBinomialNodegetHead(){
- returnhead;
- }
- privatevoidsetHead(BinomialNodehead){
- this.head=head;
- }
- publicBinomialNodemin(){
- BinomialNodenodey=null;
- BinomialNodenodex=head;
- intmin=Integer.MAX_VALUE;
- while(nodex!=null){
- if(nodex.getKey()<min){
- min=nodex.getKey();
- nodey=nodex;
- }
- nodex=nodex.getSibling();
- }
- returnnodey;
- }
- publicvoidlink(BinomialNodenodey,BinomialNodenodez){
- nodey.setParent(nodez);
- nodey.setSibling(nodez.getChild());
- nodez.setChild(nodey);
- nodez.setDegree(nodez.getDegree()+1);
- }
- publicvoidunion(BinomialHeaph2){
- this.setHead(merge(this,h2));
- BinomialNodepx=null;
- BinomialNodex=this.getHead();
- BinomialNodenx=x.getSibling();
- while(nx!=null){
- if(x.getDegree()!=nx.getDegree()
- ||(nx.getSibling()!=null&&nx.getSibling().getDegree()==x
- .getDegree())){
- px=x;
- x=nx;
- }elseif(x.getKey()<=nx.getKey()){
- x.setSibling(nx.getSibling());
- link(nx,x);
- }else{
- if(px==null){
- this.setHead(nx);
- }else{
- px.setSibling(nx);
- }
- link(x,nx);
- x=nx;
- }
- nx=x.getSibling();
- }
- }
- publicvoidinsert(BinomialNodex){
- BinomialHeaph=newBinomialHeap();
- x.setParent(null);
- x.setChild(null);
- x.setSibling(null);
- x.setDegree(0);
- h.setHead(x);
- union(h);
- }
- publicBinomialNodemerge(BinomialHeaph1,BinomialHeaph2){
- BinomialNodehead1=h1.getHead();
- BinomialNodehead2=h2.getHead();
- BinomialNodend=newBinomialNode();
- BinomialNodenode=nd;
- while(!(head1==null&&head2==null)){
- if(head1==null){
- node.setSibling(head2);
- head2=head2.getSibling();
- }elseif(head2==null){
- node.setSibling(head1);
- head1=head1.getSibling();
- }else{
- if(head1.getDegree()<head2.getDegree()){
- node.setSibling(head1);
- head1=head1.getSibling();
- }else{
- node.setSibling(head2);
- head2=head2.getSibling();
- }
- }
- node=node.getSibling();
- }
- returnnd.getSibling();
- }
- publicBinomialNodeextractMin(){
- BinomialNodenodep=null;
- BinomialNodenodey=null;
- BinomialNodenodex=head;
- BinomialNodenodeyp=null;
- intmin=Integer.MAX_VALUE;
- while(nodex!=null){
- if(nodex.getKey()<min){
- min=nodex.getKey();
- nodey=nodex;
- nodeyp=nodep;
- }
- nodep=nodex;
- nodex=nodex.getSibling();
- }
- if(nodey!=null){
- if(nodeyp==null){
- this.setHead(nodey.getSibling());
- }else{
- nodeyp.setSibling(nodey.getSibling());
- }
- BinomialHeaph1=newBinomialHeap();
- BinomialNodend=nodey.getChild();
- nodey.setChild(null);
- BinomialNode[]nds=newBinomialNode[nodey.getDegree()];
- inti=0;
- while(nd!=null){
- nd.setParent(null);
- nds[i]=nd;
- nd=nd.getSibling();
- i++;
- }
- for(intj=0;j<nds.length-1;j++){
- nd=nds[nds.length-1-j];
- nd.setSibling(nds[nds.length-2-j]);
- }
- nds[0].setSibling(null);
- h1.setHead(nds[nds.length-1]);
- this.union(h1);
- }
- returnnodey;
- }
- publicvoiddecreaseKey(BinomialNodenodex,intk){
- if(k>nodex.getKey()){
- thrownewRuntimeException();
- }
- nodex.setKey(k);
- BinomialNodenodey=nodex;
- BinomialNodenodez=nodey.getParent();
- while(nodez!=null&&nodey.getKey()<nodez.getKey()){
- inttemp=nodey.getKey();
- nodey.setKey(nodez.getKey());
- nodez.setKey(temp);
- nodey=nodez;
- nodez=nodey.getParent();
- }
- }
- publicvoiddelete(BinomialNodenodex){
- decreaseKey(nodex,Integer.MIN_VALUE);
- extractMin();
- }
- publicstaticvoidmain(String[]args){
- BinomialHeapbh=newBinomialHeap();
- int[]keys={9,10,5,14,13,8,15,12,11,7,22,6};
- BinomialNodenode=null;
- for(inti=0;i<keys.length;i++){
- BinomialNodebn=newBinomialNode();
- bn.setKey(keys[i]);
- bh.insert(bn);
- node=bn;
- }
- bh.delete(node);
- System.out.println(bh.extractMin().getKey());
- System.out.println(bh.extractMin().getKey());
- }
- }