`
yanlijun250
  • 浏览: 756436 次
文章分类
社区版块
存档分类
最新评论

算法之动态顺序统计

 
阅读更多
  1. packagecom.eshore.sweetop.dataframe;
  2. importcom.eshore.sweetop.data.KeyData;
  3. importcom.eshore.sweetop.data.Node;
  4. importcom.eshore.sweetop.data.RBNode;
  5. publicclassRBTree{
  6. privateRBNoderoot;
  7. privatestaticfinalRBNodeNIL=RBNode.getRBNode();
  8. publicRBTree(){
  9. root=NIL;
  10. }
  11. publicvoidinsert(RBNodenode){
  12. RBNodey=NIL;
  13. RBNodex=root;
  14. while(x!=NIL){
  15. y=x;
  16. if(node.getData().getKey()<x.getData().getKey()){
  17. x=x.getLeft();
  18. }else{
  19. x=x.getRight();
  20. }
  21. }
  22. node.setParent(y);
  23. if(y==NIL){
  24. root=node;
  25. }elseif(node.getData().getKey()<y.getData().getKey()){
  26. y.setLeft(node);
  27. }else{
  28. y.setRight(node);
  29. }
  30. node.setLeft(NIL);
  31. node.setRight(NIL);
  32. node.setColor(RBNode.RED);
  33. node.setSize(1);
  34. addSize(node);
  35. insertFixup(node);
  36. }
  37. privatevoidaddSize(RBNoderbn){
  38. rbn=rbn.getParent();
  39. while(rbn!=NIL){
  40. rbn.setSize(rbn.getSize()+1);
  41. rbn=rbn.getParent();
  42. }
  43. }
  44. privatevoidremSize(RBNoderbn){
  45. rbn=rbn.getParent();
  46. while(rbn!=NIL){
  47. rbn.setSize(rbn.getSize()-1);
  48. rbn=rbn.getParent();
  49. }
  50. }
  51. publicvoiddelete(RBNodenode){
  52. remSize(node);
  53. RBNodetempy=NIL,tempx=NIL;
  54. if(node.getLeft()==NIL||node.getRight()==NIL){
  55. tempy=node;
  56. }else{
  57. tempy=successor(node);
  58. }
  59. if(tempy.getLeft()!=NIL){
  60. tempx=tempy.getLeft();
  61. }else{
  62. tempx=tempy.getRight();
  63. }
  64. tempx.setParent(tempy.getParent());
  65. if(tempy.getParent()==NIL){
  66. root=tempx;
  67. }elseif(tempy==tempy.getParent().getLeft()){
  68. tempy.getParent().setLeft(tempx);
  69. }else{
  70. tempy.getParent().setRight(tempx);
  71. }
  72. if(tempy!=node){
  73. node.setData(tempy.getData());
  74. }
  75. if(tempy.getColor()==RBNode.BLACK){
  76. deleteFixup(tempx);
  77. }
  78. }
  79. privatevoiddeleteFixup(RBNodenode){
  80. RBNodetempw=NIL;
  81. while(node!=root&&node.getColor()==RBNode.BLACK){
  82. if(node==node.getParent().getLeft()){
  83. tempw=node.getParent().getRight();
  84. if(tempw.getColor()==RBNode.RED){
  85. tempw.setColor(RBNode.BLACK);
  86. node.getParent().setColor(RBNode.RED);
  87. leftRotate(node.getParent());
  88. tempw=node.getParent().getRight();
  89. }
  90. if(tempw.getLeft().getColor()==RBNode.BLACK&&tempw.getRight().getColor()==RBNode.BLACK){
  91. tempw.setColor(RBNode.RED);
  92. node=node.getParent();
  93. }else{
  94. if(tempw.getRight().getColor()==RBNode.BLACK){
  95. tempw.getLeft().setColor(RBNode.BLACK);
  96. tempw.setColor(RBNode.RED);
  97. rightRotate(tempw);
  98. }
  99. tempw.setColor(node.getParent().getColor());
  100. node.getParent().setColor(RBNode.BLACK);
  101. tempw.getRight().setColor(RBNode.BLACK);
  102. leftRotate(node.getParent());
  103. break;
  104. }
  105. }else{
  106. tempw=node.getParent().getLeft();
  107. if(tempw.getColor()==RBNode.RED){
  108. System.out.println("222");
  109. tempw.setColor(RBNode.BLACK);
  110. node.getParent().setColor(RBNode.RED);
  111. rightRotate(node.getParent());
  112. tempw=node.getParent().getLeft();
  113. }
  114. if(tempw.getLeft().getColor()==RBNode.BLACK&&tempw.getRight().getColor()==RBNode.BLACK){
  115. tempw.setColor(RBNode.RED);
  116. node=node.getParent();
  117. }else{
  118. if(tempw.getLeft().getColor()==RBNode.BLACK){
  119. tempw.getRight().setColor(RBNode.BLACK);
  120. tempw.setColor(RBNode.RED);
  121. leftRotate(tempw);
  122. }
  123. tempw.setColor(node.getParent().getColor());
  124. node.getParent().setColor(RBNode.BLACK);
  125. tempw.getLeft().setColor(RBNode.BLACK);
  126. rightRotate(node.getParent());
  127. break;
  128. }
  129. }
  130. }
  131. node.setColor(RBNode.BLACK);
  132. }
  133. privatevoidleftRotate(RBNodenode){
  134. RBNodey=node.getRight();
  135. node.setRight(y.getLeft());
  136. if(y.getLeft()!=NIL){
  137. y.getLeft().setParent(node);
  138. }
  139. y.setParent(node.getParent());
  140. if(node.getParent()==NIL){
  141. root=y;
  142. }elseif(node==node.getParent().getLeft()){
  143. node.getParent().setLeft(y);
  144. }else{
  145. node.getParent().setRight(y);
  146. }
  147. y.setLeft(node);
  148. node.setParent(y);
  149. y.setSize(node.getSize());
  150. node.setSize(node.getLeft().getSize()+node.getRight().getSize()+1);
  151. }
  152. privatevoidrightRotate(RBNodenode){
  153. RBNodex=node.getLeft();
  154. node.setLeft(x.getRight());
  155. if(x.getRight()!=NIL){
  156. x.getRight().setParent(node);
  157. }
  158. x.setParent(node.getParent());
  159. if(node.getParent()==NIL){
  160. root=x;
  161. }elseif(node==node.getParent().getLeft()){
  162. node.getParent().setLeft(x);
  163. }else{
  164. node.getParent().setRight(x);
  165. }
  166. x.setRight(node);
  167. node.setParent(x);
  168. x.setSize(node.getSize());
  169. node.setSize(node.getLeft().getSize()+node.getRight().getSize()+1);
  170. }
  171. publicvoidinsertFixup(RBNodenode){
  172. RBNodey=NIL;
  173. while(node.getParent().getColor()==RBNode.RED){
  174. if(node.getParent()==node.getParent().getParent().getLeft()){
  175. y=node.getParent().getParent().getRight();
  176. if(y.getColor()==RBNode.RED){
  177. node.getParent().setColor(RBNode.BLACK);
  178. y.setColor(RBNode.BLACK);
  179. node.getParent().getParent().setColor(RBNode.RED);
  180. node=node.getParent().getParent();
  181. }else{
  182. if(node==node.getParent().getRight()){
  183. node=node.getParent();
  184. leftRotate(node);
  185. }
  186. node.getParent().setColor(RBNode.BLACK);
  187. node.getParent().getParent().setColor(RBNode.RED);
  188. rightRotate(node.getParent().getParent());
  189. }
  190. }else{
  191. y=node.getParent().getParent().getLeft();
  192. if(y.getColor()==RBNode.RED){
  193. node.getParent().setColor(RBNode.BLACK);
  194. y.setColor(RBNode.BLACK);
  195. node.getParent().getParent().setColor(RBNode.RED);
  196. node=node.getParent().getParent();
  197. }else{
  198. if(node==node.getParent().getLeft()){
  199. node=node.getParent();
  200. rightRotate(node);
  201. }
  202. node.getParent().setColor(RBNode.BLACK);
  203. node.getParent().getParent().setColor(RBNode.RED);
  204. leftRotate(node.getParent().getParent());
  205. }
  206. }
  207. }
  208. root.setColor(RBNode.BLACK);
  209. }
  210. publicvoidwalk(){
  211. walk(root);
  212. }
  213. privatevoidwalk(RBNodenode){
  214. if(node!=NIL){
  215. walk(node.getLeft());
  216. System.out.println(node.getData()+":"+node.getColor());
  217. walk(node.getRight());
  218. }
  219. }
  220. publicRBNodesearch(intk){
  221. RBNodenode=root;
  222. while(node!=NIL&&k!=node.getData().getKey()){
  223. if(k<node.getData().getKey()){
  224. node=node.getLeft();
  225. }else{
  226. node=node.getRight();
  227. }
  228. }
  229. returnnode;
  230. }
  231. publicRBNodemin(RBNodenode){
  232. while(node.getLeft()!=NIL){
  233. node=node.getLeft();
  234. }
  235. returnnode;
  236. }
  237. publicRBNodemin(){
  238. returnmin(root);
  239. }
  240. publicRBNodesuccessor(RBNodenode){
  241. if(node.getRight()!=NIL){
  242. returnmin(node.getRight());
  243. }
  244. RBNodey=node.getParent();
  245. while(y!=NIL&&node==y.getRight()){
  246. node=y;
  247. y=y.getParent();
  248. }
  249. returny;
  250. }
  251. publicRBNodemax(RBNodenode){
  252. while(node.getRight()!=NIL){
  253. node=node.getRight();
  254. }
  255. returnnode;
  256. }
  257. publicRBNodemax(){
  258. returnmax(root);
  259. }
  260. publicRBNodegetOSSelect(inti){
  261. returngetOSSelect(root,i);
  262. }
  263. publicRBNodegetOSSelect(RBNoderbn,inti){
  264. intr=rbn.getLeft().getSize()+1;
  265. if(i==r){
  266. returnrbn;
  267. }elseif(i<r){
  268. returngetOSSelect(rbn.getLeft(),i);
  269. }else{
  270. returngetOSSelect(rbn.getRight(),i-r);
  271. }
  272. }
  273. publicintgetOSRank(RBNodenode){
  274. intr=node.getLeft().getSize()+1;
  275. RBNodetempy=node;
  276. while(tempy!=root){
  277. if(tempy==tempy.getParent().getRight()){
  278. r=r+tempy.getParent().getLeft().getSize()+1;
  279. }
  280. tempy=tempy.getParent();
  281. }
  282. returnr;
  283. }
  284. publicstaticvoidmain(String[]args){
  285. RBTreebt=newRBTree();
  286. int[]id={1,2,14,8,15,6,3};
  287. RBNodenode=null;
  288. for(inti=0;i<id.length;i++){
  289. node=newRBNode();
  290. node.setData(newKeyData(id[i]));
  291. bt.insert(node);
  292. }
  293. bt.walk();
  294. System.out.println("=====================");
  295. System.out.println("Root"+bt.root.getData());
  296. System.out.println("Max:"+bt.max().getData());
  297. System.out.println("Min:"+bt.min().getData());
  298. System.out.println(bt.search(8).getData());
  299. System.out.println(bt.successor(bt.search(8)).getData());
  300. bt.delete(bt.search(6));
  301. //System.out.println("Root"+bt.root.getData());
  302. //bt.walk();
  303. System.out.println(bt.getOSSelect(4).getData());
  304. System.out.println(bt.getOSRank(bt.search(8)));
  305. }
  306. }
分享到:
评论

相关推荐

    算法-顺序统计量

    算法 顺序统计量 期望线性 最坏线性

    算法导论中位数和顺序统计量

    算法导论,第九章,chp9中位数和顺序统计量,C#和C++代码实现。

    MIT算法导论公开课之课程笔记 顺序统计、中值.rar

    MIT算法导论公开课之课程笔记 顺序统计、中值.rar

    数据结构的顺序表算法

    数据结构的顺表表相关算法:C++顺序表,采用结构体的基本运算,采用数组的基本运算,顺序表基本运算。

    算法导论(原书第3版).part1

    本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...

    算法分析与设计——统计数字问题

    一本书的页码从自然数1开始顺序编码到自然数n。书的页码通常按照习惯编码,每个页码都不含多余的前导0.例如第6页用6表示而不用06表示或者006等。统计数字问题要求对给定的书的全部页码中分别用多少次数字0,1,2,.....

    算法导论 经典全面的算法教程

    书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...

    我用Python写的一些算法

    我用Python写的一些算法 #算法 ##排序算法:sort文件夹下面 冒泡排序 插入排序 归并排序 ...动态顺序统计树 区间树 AVL树(未实现,类似于红黑树) Tries(用于处理字符串) B树(B树的中序遍历是由

    算法导论.epub

    本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...

    算法导论扫描版

    本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...

    算法导论(英文版)mobi

    书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...

    FIFO、OPT、LRU页面置换算法实验代码和截图

    对于每种算法,程序都会统计缺页次数和缺页率。 对于FIFO页面置换算法,程序会将页面按照它们进入内存的顺序排列,并将最早进入内存的页面移除。如果某个页面不在内存中,程序就将其移入内存,并将其时间戳设置为0...

    算法精讲.mobi

    书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...

    算法导论(含课后习题答案)

    书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...

    算法导论(第二版)习题答案

    书中专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。此书还介绍了对强连通...

    算法导论文字版

    本书专门讨论了线性规划,介绍了动态规划的两个应用,随机化和线性规划技术的近似算法等,还有有关递归求解、快速排序中用到的划分方法与期望线性时间顺序统计算法,以及对贪心算法元素的讨论。本书还介绍了对强连通...

    统计数字问题 算法分析与设计

    一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的...

    C语言全套资料 C语言程序设计 C语言算法 C语言课件 C语言顺序程序设计,C语言数组,C语言循环控制,C语言预处理命令,C语言文件操作指针,C语言选择结构程序设计,C语言结构体与共用体,C语言文件操作,C语言函数

    C语言全套资料 C语言程序设计 C语言算法 C语言课件 C语言顺序程序设计,C语言数组,C语言循环控制,C语言预处理命令,C语言文件操作指针,C语言选择结构程序设计,C语言结构体与共用体,C语言文件操作,C语言函数

    算法导论中文版

     14.1 动态顺序统计  14.2 如何扩张数据结构  14.3 区间树  思考题  本章注记 第四部分 高级设计和分析技术 第15章 动态规划  15.1 钢条切割  15.2 矩阵链乘法  15.3 动态规划原理  15.4 最长公共...

    17061833 於文卓 算法分析与设计实验四+顺序统计算法设计1

    算法基本思想数组长度的时候,可以直接得到最大值和次大值数组长度大于2的时候,用递归的方法,将数组一分为二,算出左边数组的最大值和次大值,右边数组的最大值和

Global site tag (gtag.js) - Google Analytics