算法之B树

  1. packagecom.eshore.sweetop.exdataframe;
  2. publicclassBTree{
  3. privateBNoderoot;
  4. privateintmin;
  5. publicBTree(){
  6. BNodenode=newBNode();
  7. node.setLeaf(true);
  8. node.setCount(0);
  9. diskWrite(node);
  10. root=node;
  11. }
  12. publicvoidinsert(intk){
  13. BNoder=root;
  14. if(r.getCount()==(2*min-1)){
  15. BNodenode=newBNode();
  16. root=node;
  17. node.setLeaf(false);
  18. node.setCount(0);
  19. node.getChildren().add(0,root);
  20. split(node,0,r);
  21. insertNonFull(node,k);
  22. }else{
  23. insertNonFull(r,k);
  24. }
  25. }
  26. publicvoidsplit(BNodenodex,inti,BNodenodey){
  27. BNodenodez=newBNode();
  28. nodez.setLeaf(nodey.getLeaf());
  29. nodez.setCount(min-1);
  30. for(intj=0;j<min-1;j++){
  31. nodez.getKeys().add(j,nodey.getKeys().get(min+j));
  32. }
  33. if(!nodey.getLeaf()){
  34. for(intj=0;j<min;j++){
  35. nodez.getChildren().add(j,nodey.getChildren().get(min+j));
  36. }
  37. }
  38. nodey.setCount(min-1);
  39. for(intj=nodex.getCount();j>i;j--){
  40. if(j==nodex.getCount()){
  41. nodex.getChildren().add(j+1,nodex.getChildren().get(j));
  42. }else{
  43. nodex.getChildren().set(j+1,nodex.getChildren().get(j));
  44. }
  45. }
  46. nodex.getChildren().set(i+1,nodez);
  47. for(intj=nodex.getCount()-1;j>i;j++){
  48. if(j==nodex.getCount()-1){
  49. nodex.getKeys().add(j+1,nodex.getKeys().get(j));
  50. }else{
  51. nodex.getKeys().set(j+1,nodex.getKeys().get(j));
  52. }
  53. }
  54. nodex.getKeys().set(i,nodey.getKeys().get(min-1));
  55. nodex.setCount(nodex.getCount()+1);
  56. diskWrite(nodey);
  57. diskWrite(nodez);
  58. diskWrite(nodex);
  59. }
  60. publicvoidinsertNonFull(BNodenode,intk){
  61. inti=node.getCount()-1;
  62. if(node.getLeaf()){
  63. while(i>=0&&k<=node.getKeys().get(i)){
  64. if(i==node.getCount()){
  65. node.getKeys().add(i+1,node.getKeys().get(i));
  66. }else{
  67. node.getKeys().add(i+1,node.getKeys().get(i));
  68. }
  69. i--;
  70. }
  71. if(i==node.getCount()-1){
  72. node.getKeys().add(i+1,Integer.valueOf(i));
  73. }else{
  74. node.getKeys().set(i+1,Integer.valueOf(i));
  75. }
  76. node.setCount(node.getCount()+1);
  77. diskWrite(node);
  78. }else{
  79. while(i>=0&&k<=node.getKeys().get(i)){
  80. i--;
  81. }
  82. i++;
  83. diskRead(node.getChildren().get(i));
  84. if(node.getChildren().get(i).getCount()==(2*min-1)){
  85. split(node,i,node.getChildren().get(i));
  86. if(Integer.valueOf(k)>node.getKeys().get(i)){
  87. i++;
  88. }
  89. }
  90. insertNonFull(node.getChildren().get(i),k);
  91. }
  92. }
  93. publicvoiddiskWrite(BNodenode){
  94. }
  95. publicBNodediskRead(BNodebt){
  96. returnnull;
  97. }
  98. publicstaticvoidmain(String[]args){
  99. BTreebt=newBTree();
  100. bt.insert(3);
  101. }
  102. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值