破坏性地分裂红黑树吗?

问题描述

我想使用红黑树实现优先级队列。使用二进制堆是O(log n)删除最坏的情况,我将立即从队列中删除许多键,因此我希望O(log n)最坏的情况是批量删除,而不是O(m log n) )最坏的情况,其中m是一次删除的键的数量。我可能只会删除少数几个键。

我不再需要那棵老树。如何在保持黑色高度不变的同时,以破坏性的方式分割红黑树(显然可以在O(log n)中完成此操作)?

解决方法

存档中有您需要的算法的实现,网址为 https://github.com/CGAL/cgal/releases/download/releases%2FCGAL-5.0.3/CGAL-5.0.3.zip

在文件include / cgal / MultiSet.h中的

从第2617行开始,该函数是Multiset :: split

该算法也在https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjpqfz_sKrrAhVkFjQIHbnbDYYQFjADegQIAhAB&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.109.4875%26rep%3Drep1%26type%3Dpdf&usg=AOvVaw26DS8sY7M2fmunxpDfXUZn

的论文中有所描述

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...