问题 Python内置二进制搜索树? [关闭]


有没有 自平衡二叉搜索树 (红黑AVL 或其他)Python 2.7或Python 3.x中的内置类型?

我正在寻找与Java相当的东西 TreeMap的 要么 TreeSet中

如果没有这样的内置插件,为什么他们被忽略了?是否有特殊原因,因为不包括这些工具?


11940
2017-07-25 12:02


起源

标准库中没有。为什么没有被包括在内是不可能回答的。你的其余问题是对外部资源的请求,这是一个偏离主题的问题。 - Martijn Pieters♦
近乎愚蠢的 stackoverflow.com/questions/2298165/... - Fred Foo


答案:


据我所知,没有什么特别的原因 - 我猜测的原因是,对于如此众多的应用程序而言,经过高度调整 dict 和 set 实现(哈希表)运行良好。在大多数情况下,它们都足够好。肯定存在需要平衡二叉搜索树的性能特征的情况(比如基于键而不是加法顺序的有序遍历),但这些远远超出人们对抓住第三方包的乐趣在这种情况下。

我有很好的使用经验 bintrees PyPI上的包。这包括非平衡,AVL和红黑二进制树的实现,包括纯Python和写入的扩展 用Cython

我认为其余的原因基本上是历史事故。如果编写bintrees的人游说将其包含在stdlib中,并愿意忍受对维护和释放施加的约束,那么它可能会进入。(虽然Cython依赖会导致问题,但我猜。)

算法复杂度:

对于散列表(如dicts或sets),插入和查找是O(1),而对于平衡树,这些是O(log(n))。按键的有序遍历是树中的O(n),但是为了对哈希表执行相同的操作,您需要先对键进行排序,因此它是O(n * log(n))。当您选择使用哪种数据结构时,您需要考虑将要使用哪些操作,并选择在您的应用程序中最有意义的权衡。


15
2017-07-25 12:10



这很有道理。我猜可能是这样的 dict 和 set 实际上是二叉搜索树,或者更高效的东西。我将对这些实现方式进行一些研究。 - Chirila Alexandru
@ChirilaAlexandru: dict 和 set 哈希表。 - Fred Foo
@wilberforce:我会给 blist 更好地登陆stdlib。我认为它实际上已被考虑过了,但我不记得细节了。 - Fred Foo
@ChirilaAlexandru:哈希表查找是O(1),而不是O(n) - 这就是为什么它们经常是你想要的。有时候选择一个好的哈希函数可能会很棘手 - 如果你有很多碰撞,很多好处都会消失。 - babbageclunk
或者更确切地说,最坏情况下的哈希表可以是O(n),但是在预期的情况下具有良好的哈希函数是O(1)。它们确实比相同大小的树使用更多的内存来帮助确保实际发生预期的情况,但是额外的内存也用于分摊扩展数据结构的成本,因为还添加了更多的项目。 - chepner


您将无法在标准库中找到任何树。 Python大量使用字典作为其内部的哈希表(对象,类和模块都基于dicts)。因此,dicts已经大大优化。这使搜索树的需求更小。为了有效,这种树也将以扩展类型实现。


1
2017-07-25 12:08