Python的标准库中是否有用于平衡二叉树的模块?


74

Python标准库中是否有用于AVL树红黑树或其他类型的平衡二叉树的模块?


1
我只使用集合或字典。如果需要使用更好的哈希例程,请定义__hash__()。您需要更高级的东西吗?如果是这样,为什么?顺便说一句,如果您在docs.python.org中找不到它,则可能不是标准模块。
Mike DeSimone 2010年

1
@Mike-我正在尝试解决来自Euler项目的任务。我认为,使用平衡的二叉搜索树而不是我的一个数据容器的列表会加快对数比率的算法(由于O(logn)搜索),这将解决任务而不会使我的计算机升温。另外,我对此很好奇。
aeter 2010年

1
他用于O(1)查找的集合怎么样
mmmmmm 2010年

@Mark:谢谢,这对我来说似乎是一个更好的解决方案。我需要的是一个具有快速添加和快速查找功能的数据结构-而且我不知道在Python中设置如此快速。
aeter 2010年

Answers:


41

不,stdlib中没有平衡的二叉树。但是,从您的评论看来,您可能还有其他选择:

  • 您说您想要一个BST而不是一个O(log n)搜索列表。如果只需要搜索,并且您的数据已经排序,则该bisect模块为列表提供二进制搜索算法。
  • 迈克·德西蒙(Mike DeSimone)建议了布景和格言,您解释了为什么列表在算法上太慢。集和字典被实现为具有O(1)查找的哈希表。解决Python中大多数问题的方法实际上是“使用字典”。

如果两种解决方案都不适合您,则必须转到第三方模块或实施自己的模块。


2
非常感谢你!使用一套解决了我的问题。我不知道他们在Python中有O(1)查找(我一直认为在找到正确的值之前应该遍历整个集合-但正如我所说的,我是Python的新手)。也感谢您对Python中常用数据结构的解释。
aeter 2010年

dict或set的实现基于哈希表。由于哈希函数的math属性,查找平均而言是恒定时间。en.wikipedia.org/wiki/Hash_table
Jeanno,


11

在某些情况下,我发现(在stadndard库中)heapq包很有用,尤其是在任何给定时间希望O(1)访问集合中最小元素的时间的情况下。

对我来说,我一直在跟踪计时器的集合,通常只想检查最小的时间(最先执行的时间)是否已经准备就绪。


6

有一个名为“ bintrees”的新程序包,它支持不平衡的,AVL和RB树。你可以在这里找到它。


我安装了bintrees模块(2.0.1),但是在导入它时,我收到消息:Warning: FastBinaryTree not available, using Python version BinaryTree.知道如何解决这个问题吗?我安装了Cython,但在导入时仍会给出该错误。
yaraju 2014年

我有点想通-在Windows上,FastXTree版本需要安装C编译器,例如MSVC或Mingw32。我还没有尝试过-因为我很可能会实现自定义树。
yaraju 2014年

3
来自pypi.python.org/pypi/bintrees/2.0.1:“编译快速树需要Cython,而在Windows上则需要C编译器(MingW可以正常工作)。”
yaraju 2014年

在安装cython之后,@ yaraju必须重新安装bintrees才能编译快速扩展。
hruske



0

我编写了Java TreeMap / TreeSet的Python版本,其基础数据结构是平衡的二叉树(准确地说是红黑树)。

可以在此仓库中访问源代码和文档

您可以使用安装pip install pytreemap。已针对Python> = 3.5测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.