算法之斐波那契堆

本文介绍了一种高效的数据结构——斐波那契堆的实现方法。斐波那契堆是一种用于实现优先队列的数据结构,它支持快速的插入、删除最小元素及减少键等操作。文中详细展示了斐波那契堆的各个核心方法,如插入、删除、减少键等,并通过示例代码加以说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值