跳转到主要内容

该软件包为Python和Cython提供了二叉树、红黑树和AVL树。

项目描述

二叉树软件包

Bintrees 开发已停止

请使用 sortedcontainers 替代: https://pypi.python.org/pypi/sortedcontainers

另请参阅 PyCon 2016 演示: https://www.youtube.com/watch?v=7z2Ki44Vs4E

优点

  • 纯Python,无Cython/C依赖

  • 更快

  • 活跃开发

  • 更多且更好的测试/分析

摘要

本软件包提供了用Python和Cython/C编写的二叉树、红黑树和AVL树。

这些类比内置的 dict 类慢得多,但所有迭代器/生成器都会以排序键顺序产生数据。在大多数情况下,树可以用作字典的替代品。

算法来源

AVL-和RBTree算法取自Julienne Walker: http://eternallyconfuzzled.com/jsw_home.aspx

用Python编写的树

  • BinaryTree – 不平衡的二叉树

  • AVLTree – 平衡的AVL树

  • RBTree – 平衡的红黑树

使用C函数和Cython编写的树

  • FastBinaryTree – 不平衡的二叉树

  • FastAVLTree – 平衡的AVL树

  • FastRBTree – 平衡的红黑树

所有树都提供相同的API,支持pickle协议。

Cython-Trees 使用 C-structs 作为树节点,并使用 C 函数进行底层操作

  • 插入

  • 删除

  • 获取值

  • 最小项

  • 最大项

  • 前一项

  • 后一项

  • 向下取整项

  • 向上取整项

构造函数

  • Tree() -> 创建一个新空树;

  • Tree(mapping) -> 从映射创建新树(只需要 items() 方法)

  • Tree(seq) -> 从序列创建新树 [(k1, v1), (k2, v2), … (kn, vn)]

方法

  • __contains__(k) -> 如果 T 有键 k,则为 True,否则为 False,O(log(n))

  • __delitem__(y) <==> del T[y], del[s:e], O(log(n))

  • __getitem__(y) <==> T[y], T[s:e], O(log(n))

  • __iter__() <==> iter(T)

  • __len__() <==> len(T), O(1)

  • __max__() <==> max(T),获取 T 的最大项 (k,v),O(log(n))

  • __min__() <==> min(T),获取 T 的最小项 (k,v),O(log(n))

  • __and__(other) <==> T & other,交集

  • __or__(other) <==> T | other,并集

  • __sub__(other) <==> T - other,差集

  • __xor__(other) <==> T ^ other,对称差集

  • __repr__() <==> repr(T)

  • __setitem__(k, v) <==> T[k] = v,O(log(n))

  • __copy__() -> 浅拷贝支持,copy.copy(T)

  • __deepcopy__() -> 深拷贝支持,copy.deepcopy(T)

  • clear() -> None,从 T 中移除所有项,O(n)

  • copy() -> T 的浅拷贝,O(n*log(n))

  • discard(k) -> None,从 T 中移除 k,如果存在,O(log(n))

  • get(k[,d]) -> T[k] 如果 k 在 T 中,否则 d,O(log(n))

  • is_empty() -> 如果 len(T) == 0,则为 True,O(1)

  • items([reverse]) -> T 中 (k, v) 项的生成器,O(n)

  • keys([reverse]) -> T 中键的生成器,O(n)

  • values([reverse]) -> T 中值的生成器,O(n)

  • pop(k[,d]) -> v,移除指定的键并返回相应的值,O(log(n))

  • pop_item() -> (k, v),移除并返回一些 (键,值) 对作为二元组,O(log(n)) (同义词 popitem() 存在)

  • set_default(k[,d]) -> value,T.get(k, d),如果 k 不在 T 中,则也设置 T[k]=d,O(log(n)) (同义词 setdefault() 存在)

  • update(E) -> None。从字典/可迭代对象 E 更新 T,O(E*log(n))

  • foreach(f, [order]) -> 访问树的所有节点(0 = ‘inorder’,-1 = ‘preorder’ 或 +1 = ‘postorder’),并对每个节点调用 f(k, v),O(n)

  • iter_items(s, e[, reverse]) -> T 中 s <= key < e 的 (k, v) 项的生成器,O(n)

  • remove_items(keys) -> None,通过键移除项,O(n)

通过键进行切片

  • item_slice(s, e[, reverse]) -> T 中 s <= key < e 的 (k, v) 项的生成器,O(n),同义词为 iter_items(…)

  • key_slice(s, e[, reverse]) -> T 中 s <= key < e 的键的生成器,O(n)

  • value_slice(s, e[, reverse]) -> T 中 s <= key < e 的值的生成器,O(n)

  • T[s:e] -> TreeSlice 对象,其键在 s <= key < e 的范围内,O(n)

  • del T[s:e] -> 通过键切片移除项,对于 s <= key < e,O(n)

起始/结束参数

  • 如果 's' 为 None 或 T[:e] TreeSlice/迭代器从 min_key() 的值开始;

  • 如果 'e' 为 None 或 T[s:] TreeSlice/迭代器以 max_key() 的值结束;

  • T[:] 是表示整个树的 TreeSlice;

常规切片语法 T[s:e:step] 的步长参数将被静默忽略。

TreeSlice 是一个带有范围检查的树包装器,不包含对对象的引用,删除相关树中的对象也将删除 TreeSlice 中的对象。

  • TreeSlice[k] -> 获取键 k 的值,如果 k 不在 s:e 范围内,则引发 KeyError

  • TreeSlice[s1:e1] -> TreeSlice 对象,其键在 s1 <= key < e1 的范围内
    • 新下限是 max(s, s1)

    • 新上限是 min(e, e1)

TreeSlice 方法

  • items() -> T 中 (k, v) 项的生成器,O(n)

  • keys() -> T 中键的生成器,O(n)

  • values() -> T 中值的生成器,O(n)

  • __iter__ <==> keys()

  • __repr__ <==> repr(T)

  • __contains__(key) -> 如果TreeSlice包含键k,则返回True,否则返回False,时间复杂度为O(log(n))

prev/succ操作

  • prev_item(key) -> 获取(k, v)对,其中k是key的前驱,时间复杂度为O(log(n))

  • prev_key(key) -> k,获取key的前驱,时间复杂度为O(log(n))

  • succ_item(key) -> 获取(k, v)对作为2元组,其中k是key的后继,时间复杂度为O(log(n))

  • succ_key(key) -> k,获取key的后继,时间复杂度为O(log(n))

  • floor_item(key) -> 获取(k, v)对,其中k是小于或等于key的最大键,时间复杂度为O(log(n))

  • floor_key(key) -> k,获取小于或等于key的最大键,时间复杂度为O(log(n))

  • ceiling_item(key) -> 获取(k, v)对,其中k是大于或等于key的最小键,时间复杂度为O(log(n))

  • ceiling_key(key) -> k,获取大于或等于key的最小键,时间复杂度为O(log(n))

堆方法

  • max_item() -> 获取T中最大的(key, value)对,时间复杂度为O(log(n))

  • max_key() -> 获取T中最大的键,时间复杂度为O(log(n))

  • min_item() -> 获取T中最小的(key, value)对,时间复杂度为O(log(n))

  • min_key() -> 获取T中最小的键,时间复杂度为O(log(n))

  • pop_min() -> (k, v),移除键最小的项,时间复杂度为O(log(n))

  • pop_max() -> (k, v),移除键最大的项,时间复杂度为O(log(n))

  • nlargest(i[,pop]) -> 获取i个最大的(k, v)项列表,时间复杂度为O(i*log(n))

  • nsmallest(i[,pop]) -> 获取i个最小的(k, v)项列表,时间复杂度为O(i*log(n))

集合方法(使用frozenset)

  • intersection(t1, t2, …) -> 包含所有树中公共键的树

  • union(t1, t2, …) -> 包含任意一个树中键的树

  • difference(t1, t2, …) -> 包含T中的键但不包含t1, t2, …中的键的树

  • symmetric_difference(t1) -> 包含T和t1中但不同时包含两者的键的树

  • is_subset(S) -> 如果T中的每个元素都在S中,则返回True(同义词issubset()存在)

  • is_superset(S) -> 如果S中的每个元素都在T中,则返回True(同义词issuperset()存在)

  • is_disjoint(S) -> 如果T和S没有交集,则返回True(同义词isdisjoint()存在)

类方法

  • from_keys(S[,v]) -> 从S中获取键并赋予值v的新树。(同义词fromkeys()存在)

辅助函数

  • bintrees.has_fast_tree_support() -> 如果Cython扩展正在工作,则返回True,否则返回False(False = 使用纯Python实现)

安装

从源代码安装

python setup.py install

或从PyPI安装

pip install bintrees

编译快速树需要Cython,在Windows上还需要C编译器。

下载Windows的二进制文件

https://github.com/mozman/bintrees/releases

文档

本README.rst

bintrees可在GitHub.com找到

https://github.com/mozman/bintrees.git

新闻

版本2.1.0 - 2020-01-02

版本2.0.7 - 2017-04-28

  • BUGFIX:foreach(纯Python实现)与空树一起工作

  • 在PyMem_Malloc()和PyMem_Free()调用中获取GIL

版本2.0.6 - 2017-02-04

  • BUGFIX:正确实现tree中的deepcopy()

版本2.0.5 - 2017-02-04

  • 支持copy.deepcopy()

  • 将状态改回成熟,将有:错误修复、兼容性检查以及像这种深度复制支持之类的简单添加,因为收到反馈,说在一些特殊情况下bintrees可能很有用。

  • 将开发转向64位和MS编译器 - 在Windows 7上,现在CPython 2.7/3.5/3.6一切正常工作

仓库已迁移到GitHub:https://github.com/mozman/bintrees.git

版本2.0.4 - 2016-01-09

  • 移除导入时的日志语句

  • 添加辅助函数bintrees.has_fast_tree_support()

  • 提示:使用 Cython 扩展时,PyPy 比 CPython 运行更快

版本 2.0.3 - 2016-01-06

  • 用 logging.warning 替换了 print 函数以记录导入警告信息

  • 已知问题:无法使用 MingW32 和 CPython 3.5 以及 CPython 2.7.10 构建 Cython 扩展

版本 2.0.2 - 2015-02-12

  • 由 Sam Yaple 修复了 foreach cython-function

版本 2.0.1 - 2013-10-01

  • 移除了 __del__() 方法以避免垃圾收集问题

版本 2.0.0 - 2013-06-01

  • API 更改:与 dict/set 兼容的同义词保持一致的方法命名

  • 代码库重构

  • 移除了树遍历器

  • 移除了低级节点栈实现 -> 导致崩溃

  • 针对 PyPy 的优化:iter_items(), succ_item(), prev_item()

  • 在 Win7 和 Linux Mint 15 x64 (pypy-1.9) 上使用 CPython2.7, CPython3.3, pypy-2.0 进行测试

版本 1.0.3 - 2013-05-01

  • 扩展了 iter_items(startkey=None, endkey=None, reverse=reverse) -> 优化切片性能

  • 为 Fast_X_Trees() 实现了 iter_items() 的 Cython 版本

  • 添加了 key 参数 reverse 到 itemslice(), keyslice(), valueslice()

  • 使用 CPython2.7, CPython3.3, pypy-2.0 进行测试

版本 1.0.2 - 2013-04-01

  • 错误修复:在插入现有键时 FastRBTree 数据损坏

  • 错误修复:联合操作 & 对称差集 - 将所有值复制到结果树中

版本 1.0.1 - 2013-02-01

  • 错误修复

  • graingert 的重构

  • 跳过 PyPy 的无意义测试

  • 新许可证:MIT 许可证

  • 使用 CPython2.7, CPython3.2, CPython3.3, pypy-1.9, pypy-2.0-beta1 进行测试

  • 统一行结束符为 LF

  • PEP8 重构

  • 添加了 floor_item/key, ceiling_item/key 方法,感谢 Dai Mikurube

版本 1.0.0 - 2011-12-29

  • 错误修复

  • 状态:5 - 生产/稳定

  • 移除了无用的 TreeIterator() 类和 T.treeiter() 方法。

  • Max Motovilov 的补丁以使用 Visual Studio 2008 构建 C-扩展

版本 0.4.0 - 2011-04-14

  • API 更改!!!

  • 完全支持 Python 3,包括 Cython 实现

  • 移除了用户定义的 compare() 函数 - 键必须是可比较的!

  • 移除了 T.has_key(),使用 ‘key in T’

  • keys(), items(), values() 生成“视图”

  • 移除了 iterkeys(), itervalues(), iteritems() 方法

  • 将索引切片替换为键切片

  • 移除了 index() 和 item_at()

  • repr() 产生正确的表示

  • 在无 Cython 的系统上安装(使用 pypy 进行测试)

  • 新许可证:GNU 库或通用公共许可证(LGPL)

版本 0.3.2 - 2011-04-09

  • 添加了 itemslice(startkey, endkey), keyslice(startkey, endkey), valueslice(startkey, endkey) - 通过键进行切片

  • 使用 pypy 1.4.1 进行测试,速度极快

  • 纯 Python 树与 Python 3 兼容

  • 没有为 Python 3 提供 Cython 实现

版本 0.3.1 - 2010-09-10

  • 与 Python 2.7 兼容

版本 0.3.0 - 2010-05-11

  • 以 c 模块的形式编写低级函数,仅通过 Python 接口是 Cython 模块

  • 支持 pickle 协议

版本 0.2.1 - 2010-05-06

  • 添加了 delslice del T[0:3] -> 删除节点 0, 1, 2

  • 添加了 discard -> 如果未找到则删除键而不会引发 KeyError

  • 添加了堆方法:min, max, nlarges, nsmallest …

  • 添加了 Set 方法 -> 交集,差集,并集,…

  • 添加了切片:T[5:10] 获取位置 (不是键!) 5, 6, 7, 8, 9 的项

    T[5] 获取键为 5 的项

  • 添加了 index: T.index(key) -> 获取项 的位置

  • 添加了 item_at: T.item_at(0) -> 获取位置 (不是键!) 0 的项

    T.item_at(0) O(n)! <==> T.min_item() O(log(n))

版本 0.2.0 - 2010-05-03

  • TreeMixin 类作为 Python-Trees 的基础类,同时也是 Cython-Trees 的 Mixin

版本 0.1.0 - 2010-04-27

  • Alpha 状态

  • 初始发布

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

bintrees-2.2.0.zip (108.3 kB 查看哈希值)

上传时间

构建分布

bintrees-2.2.0-cp39-cp39-win_amd64.whl (64.2 kB 查看哈希值)

上传时间 CPython 3.9 Windows x86-64

bintrees-2.2.0-cp39-cp39-macosx_10_14_x86_64.whl (60.7 kB 查看哈希值)

上传时间 CPython 3.9 macOS 10.14+ x86-64

bintrees-2.2.0-cp38-cp38-win_amd64.whl (64.3 kB 查看哈希值)

上传时间 CPython 3.8 Windows x86-64

bintrees-2.2.0-cp38-cp38-macosx_10_14_x86_64.whl (59.4 kB 查看哈希值)

上传时间 CPython 3.8 macOS 10.14+ x86-64

bintrees-2.2.0-cp37-cp37m-win_amd64.whl (62.9 kB 查看哈希值)

上传时间 CPython 3.7m Windows x86-64

bintrees-2.2.0-cp37-cp37m-macosx_10_14_x86_64.whl (59.0 kB 查看哈希值)

上传时间 CPython 3.7m macOS 10.14+ x86-64

bintrees-2.2.0-cp36-cp36m-win_amd64.whl (63.0 kB 查看哈希值)

上传时间 CPython 3.6m Windows x86-64

bintrees-2.2.0-cp36-cp36m-macosx_10_14_x86_64.whl (60.3 kB 查看哈希值)

上传时间 CPython 3.6m macOS 10.14+ x86-64

由以下机构支持