Python 2.7中是否存在自平衡二进制搜索树( RED-BLACK , AVL 或其他)内置类型Python 3.x?
我正在寻找与Java的TreeMap或TreeSet相当的东西。
如果没有这样的内置插件,他们为什么会被忽略?是否有特殊原因,因为不包括这些工具?
答案 0 :(得分:17)
据我所知,没有特别的原因 - 我猜测的原因是,对于这么多应用程序,高度调整的dict
和set
实现(哈希表)运行良好。在大多数情况下,它们都足够好。肯定存在需要平衡二叉搜索树的性能特征的情况(比如基于键而不是加法顺序的有序遍历),但这些远远超出了人们对抓住第三方包的乐趣。在那种情况下。
我在PyPI上使用bintrees包有很好的经验。这包括纯粹的Python和Cython中编写的扩展的非平衡,AVL和红黑二进制树的实现。
我认为其余的原因基本上是历史事故。如果编写bintrees的人游说将其包含在stdlib中,并且愿意忍受对维护和释放施加的约束,那么它可能会进入。(虽然Cython依赖会导致问题,但我猜。)
算法复杂性:
对于散列表(如dicts或sets),插入和查找是O(1),而对于平衡树,这些是O(log(n))。按键的有序遍历是树中的O(n),但是为了对哈希表执行相同的操作,您需要先对键进行排序,因此它是O(n * log(n))。当您选择使用哪种数据结构时,您需要考虑将要使用哪些操作,并选择在您的应用程序中最有意义的权衡。
答案 1 :(得分:1)
您在标准库中找不到任何树。 Python大量使用字典作为其内部的哈希表(对象,类和模块都基于dicts)。因此,dicts已经大大优化。这使搜索树的需求更小。为了有效,这种树也将以扩展类型实现。