当我应该考虑使用RB树,B-树或AVL树程序员? 什么是需要决定选择前要考虑的关键点?
可有人请用它为什么选择在他人参考关键点每个树结构的情况解释一下吗?
当我应该考虑使用RB树,B-树或AVL树程序员? 什么是需要决定选择前要考虑的关键点?
可有人请用它为什么选择在他人参考关键点每个树结构的情况解释一下吗?
用少许盐借此:
当你管理着超过数千种商品,你就从磁盘或有些慢存储介质,其中分页B树。
当你正在做的相当频繁的插入,删除和检索的树RB树。
AVL树当你插入和删除是相对于您检索罕见。
我认为B +树是一个很好的通用有序容器数据结构,即使在主内存中。 即使当虚拟内存是不是一个问题,缓存友好往往是,和B +树是顺序存取特别好 - 同样的渐近性能为一个链表,但缓存友好接近一个简单的数组。 所有这一切都和O(log n)的查找,插入和删除。
B +树是有问题的,虽然 - 如节点内四处移动的物品当你插入/删除,无效指针的项目。 我有一个容器库,做“光标维护” - 光标依附他们目前在链表中引用的叶节点,使他们能够自动修复或失效。 由于有很少超过一个或两个指针,它工作得很好 - 但它的工作都是一样的额外位。
另一件事是,B +树基本上是这一点。 我想你可以脱掉或取决于你是否需要他们或无法重新创建非叶节点,但与二叉树结点,你得到了更大的灵活性。 二叉树可以被转换成一个链表和背部不复制节点 - 你只需要改变的指针,然后记住,你把它当作一个不同的数据结构了。 别的不说,这意味着您可以很容易为O(n)合并的树木 - 树木都转换成列表,将它们合并,然后再转换回一棵树。
然而,另一件事是内存分配和释放。 在二进制树,这可以从算法被分离出来 - 用户可以创建一个节点然后调用插入算法,和删除可以提取节点(从树分离它们,但不释放存储器)。 在B树或B +树,这显然是行不通的 - 数据将生活在一个多项目节点。 编写插入方法是“计划”,而无需修改节点,直到他们知道新的节点有多少需要,他们可以分配的操作是一个挑战。
红黑色与AVL? 我不知道这有什么大的区别。 我自己的图书馆有一个基于策略的“工具”类操作节点,与双链表,简单的二进制树,伸展树,红黑树和treaps,包括各种转换方法。 其中一些方法,只实现,因为我是在同一时间或其他无聊。 我不知道我还测试过的树堆的方法。 我选择了红黑树,而不是AVL的原因是因为我个人理解算法更好 - 这并不意味着他们是简单的,它只是一个历史的侥幸我比较熟悉。
最后一两件事 - 我只是最初开发我的B +树的容器作为实验。 那是一种永远结束了真正的实验之一,但它不是我会鼓励别人重复。 如果你需要的是一个有序的容器,最好的答案是使用现有的库提供了一个 - 例如性病::地图等,在C ++。 我的图书馆发展了多年,花了相当一段时间才能得到它的稳定,我只是比较最近发现它在技术上不可移植(取决于位未定义行为WRT offsetof的)。
在记忆B树的优点,当项目数超过32000 ...看看speedtest.pdf从STX-B树 。
当选择数据结构,你的交易一次性因素如
我会通过阅读由罗伯特·哈维引用Wikipedia文章开始。
务实的态度,在语言如Java工作时,一般的程序员趋向于使用所提供的集合类。 如果在性能调节活性的一种发现,收集的性能是有问题的,然后一个可以寻求替代实现。 这是很少以业务为导向的发展必须考虑的第一件事。 这是极为罕见的是一个需要实现由手这样的数据结构中,通常可以使用库。