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

Posted

技术标签:

【中文标题】Python的标准库中是不是有平衡二叉树的模块?【英文标题】:Is there a module for balanced binary tree in Python's standard library?Python的标准库中是否有平衡二叉树的模块? 【发布时间】:2010-02-19 17:06:42 【问题描述】:

在 Python 的标准库中是否有用于 AVL tree 或 red–black tree 或其他类型的平衡二叉树的模块?

【问题讨论】:

我只使用集合或字典。如果我需要使用更好的散列例程,我定义__hash__()。你需要更高级的东西吗?如果是这样,为什么?顺便说一句,如果您在 docs.python.org 中找不到它,它可能不是标准模块。 @Mike - 我正在尝试解决 Project Euler 的任务。我认为对我的一个数据容器使用平衡的二叉搜索树而不是列表会以对数比加速算法(因为 O(logn) 搜索),这样可以在不加热我的计算机的情况下解决任务。另外,我只是对此感到好奇。 O(1) 查找的集合怎么样 @Mark:谢谢,这对我来说似乎是一个更好的解决方案。我需要的是一种具有快速添加和快速查找功能的数据结构——我不知道 Python 中的集合速度如此之快。 Does python have a sorted list?的可能重复 【参考方案1】:

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

你说你想要一个 BST 而不是 O(log n) 搜索的列表。如果您只需要搜索并且您的数据已经排序,bisect 模块会为列表提供二进制搜索算法。 Mike DeSimone 推荐了集合和字典,您解释了为什么列表在算法上太慢了。集合和字典实现为哈希表,具有 O(1) 查找。 Python 中大多数问题的解决方案确实是“使用字典”。

如果这两种解决方案都不适合您,您将不得不使用第三方模块或实施您自己的模块。

【讨论】:

非常感谢!使用一套解决了我的问题。我不知道他们在 Python 中有 O(1) 查找(我一直认为应该在找到正确的值之前遍历整个集合 - 但正如我所说,我是 Python 新手)。也感谢您对 Python 中常用数据结构的解释。 dict或set的实现是基于hash表的。由于哈希函数的数学属性,查找的平均时间是恒定的。 en.wikipedia.org/wiki/Hash_table【参考方案2】:

stdlib 中没有这种类型的东西,as far as I can see,但是quick look at pypi brings up a few alternative:

rbtree pyavl blist

【讨论】:

还有一个 fast-as-C 但纯 Python 实现称为 sortedcontainers 文档有一个很好的 performance comparison 以及您列出的替代方案。【参考方案3】:

在某些情况下,我发现heapq package(在标准库中)很有用,特别是如果在任何给定时间您希望 O(1) 访问您集合中最小元素的时间。

对我来说,我一直在跟踪一组计时器,并且通常只对检查最小的时间(首先执行的时间)是否已经准备就绪感兴趣。

【讨论】:

【参考方案4】:

还可以查看Sorted Containers 项目。

这里有一个关于它的 PyCon 讨论:https://www.youtube.com/watch?v=7z2Ki44Vs4E

【讨论】:

这个好像是2018年最新的。【参考方案5】:

有一个名为“bintrees”的新软件包,它支持 ubalanced、AVL 和 RB 树。你可以找到它here。

【讨论】:

我安装了 bintrees 模块 (2.0.1),但是当我导入它时,我收到消息:Warning: FastBinaryTree not available, using Python version BinaryTree. 知道如何解决这个问题吗?我安装了 Cython,但它仍然在导入时出现该错误。 我想通了 - 在 Windows 上,FastXTree 版本需要安装 C 编译器,例如 MSVC 或 Mingw32。我还没有尝试过 - 因为我很可能会为我的目的实现一个自定义树。 来自pypi.python.org/pypi/bintrees/2.0.1:“编译快速 Trees 需要 Cython,在 Windows 上需要 C 编译器(MingW 工作正常)。” @yaraju 安装完 cython 后,需要重新安装 bintrees 才能编译快速扩展。【参考方案6】:

没有,但有 AVL Tree Objects for Python(非常老!)和 SourceForge 上的(已关闭)项目 - avl-trees for Python。

【讨论】:

【参考方案7】:

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

源代码和文档可以在this repo访问

您可以使用pip install pytreemap 进行安装。 测试 Python >=3.5

【讨论】:

以上是关于Python的标准库中是不是有平衡二叉树的模块?的主要内容,如果未能解决你的问题,请参考以下文章

判断是否是平衡二叉树

平衡二叉树(AVL)与红黑树

平衡二叉树的构建

红黑树和AVL树的区别(转)

判断一颗二叉树是否为二叉平衡树 python 代码

平衡二叉树---将有序数组转换为二叉搜索树