该软件包为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的二进制文件
文档
本README.rst
bintrees可在GitHub.com找到
新闻
版本2.1.0 - 2020-01-02
使用sortedcontainers代替:https://pypi.python.org/pypi/sortedcontainers
项目状态:不活跃
移除了官方Python 2支持
版本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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e180658d90789855dcb0e7d1eb2bfebc452d60c5b48e74de16b502d61a8352d1 |
|
MD5 | b0e84d24ac7155dd4f73b59581dcb26f |
|
BLAKE2b-256 | a11fe76488f335e532dc0bbc90336fe35f9a99a030964b05a9f2106ae03006db |
bintrees-2.2.0-cp39-cp39-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 01c1968027c4da0c54f185bde2b7043ae5a826c0edd1beaef57da9c6cbe4d475 |
|
MD5 | 93ba606f88595e1e60bb7281db9f487b |
|
BLAKE2b-256 | 4939549e15f4b807e6b2458bfd5b2e24cfa2ed79bd2244cc2b9b75294b50e648 |
bintrees-2.2.0-cp39-cp39-macosx_10_14_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 0b1faf7c2d7d5c0ee367901268fa19ef80360cbb16e88d0a27ecab5eeb01bfac |
|
MD5 | e4cca3d17a570490e06a8298677327d3 |
|
BLAKE2b-256 | 32f52c3df604cc279bf1cfee31d09280dd8ee99a8dc0faede30baf0ac957590d |
bintrees-2.2.0-cp38-cp38-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 5ac1a93476a5a84b20b2bd5fa43d486cd971ef9749b564eaf95c46244af02523 |
|
MD5 | 9d446fe015e45372ec98f293ab5ab3d5 |
|
BLAKE2b-256 | a445fef07d6efc4538fd525d7fb23078623915c7bf494938f85bcc9b00666c4a |
bintrees-2.2.0-cp38-cp38-macosx_10_14_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 18e6a28b09c7821cc29d40d4192d6f051ad9e8febb5962b0c30829b6e3c6509a |
|
MD5 | 6aba652f9b60cf074757a7a09aaeb4f2 |
|
BLAKE2b-256 | 744e735684681ec819377ba2b928f5fc0cd6be40b40edcad48a281d6826a9463 |
bintrees-2.2.0-cp37-cp37m-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 72bc8e2a9322011d8983980df4ce8e729781ec1ae63b41b8ee5fa34b41adb0b2 |
|
MD5 | e7c3ef880e32d8293aba3e0daad39995 |
|
BLAKE2b-256 | 75ea788225357a6baaf157a941671b8cc9435b73c4aa3d6b33ea2a2c8e2d9f2e |
bintrees-2.2.0-cp37-cp37m-macosx_10_14_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 620b799e07849765a5107e56349a4c422576084c75323315690b2ac0cdf4a7e4 |
|
MD5 | d592e971bb9648c54c062f0e7f86768b |
|
BLAKE2b-256 | 5294dff57ad4b0f16bb0e114c2bbe476be30413206d3406a9ecd4b545aff51e2 |
bintrees-2.2.0-cp36-cp36m-win_amd64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | bfbc4dd3181609120d20ee73247521a8549644d129cd61582a986b1ef0671bd4 |
|
MD5 | 398967fa46b3027b044ff3fb15e5eb43 |
|
BLAKE2b-256 | e7e38e8c55058a06d866843505535d130b5272deeb1dc94be1e4bae19f70c459 |
bintrees-2.2.0-cp36-cp36m-macosx_10_14_x86_64.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fd447cf71e7a81073a91de75c56e7ca530fda563832b97d69fd882b9e0ef89b1 |
|
MD5 | 7eea89e294e7dcf82c75be449a0fd96e |
|
BLAKE2b-256 | 3208d195d2956b7e1e818206f928cdb2c6a4d5c6bfa6d095d46a167150c9eb07 |