Package: bintrees
Binary Tree PackageBintrees Development StoppedUsesortedcontainersinstead:https://pypi.python.org/pypi/sortedcontainerssee also PyCon 2016 presentation:https://www.youtube.com/watch?v=7z2Ki44Vs4EAdvantages:pure Python no Cython/C dependenciesfasteractive developmentmore & better testing/profilingAbstractThis package provides Binary- RedBlack- and AVL-Trees written in Python and Cython/C.This Classes are much slower than the built-indictclass, but all
iterators/generators yielding data in sorted key order. Trees can be
uses as drop in replacement fordictsin most cases.Source of AlgorithmsAVL- and RBTree algorithms taken from Julienne Walker:http://eternallyconfuzzled.com/jsw_home.aspxTrees written in PythonBinaryTree– unbalanced binary treeAVLTree– balanced AVL-TreeRBTree– balanced Red-Black-TreeTrees written with C-Functions and Cython as wrapperFastBinaryTree– unbalanced binary treeFastAVLTree– balanced AVL-TreeFastRBTree– balanced Red-Black-TreeAll trees provides the same API, the pickle protocol is supported.Cython-Trees have C-structs as tree-nodes and C-functions for low level operations:insertremoveget_valuemin_itemmax_itemprev_itemsucc_itemfloor_itemceiling_itemConstructorTree() -> new empty tree;Tree(mapping) -> new tree initialized from a mapping (requires only an items() method)Tree(seq) -> new tree initialized from seq [(k1, v1), (k2, v2), … (kn, vn)]Methods__contains__(k) -> True if T has a key k, else 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), get max item (k,v) of T, O(log(n))__min__() <==> min(T), get min item (k,v) of T, O(log(n))__and__(other) <==> T & other, intersection__or__(other) <==> T | other, union__sub__(other) <==> T - other, difference__xor__(other) <==> T ^ other, symmetric_difference__repr__() <==> repr(T)__setitem__(k, v) <==> T[k] = v, O(log(n))__copy__() -> shallow copy support, copy.copy(T)__deepcopy__() -> deep copy support, copy.deepcopy(T)clear() -> None, remove all items from T, O(n)copy() -> a shallow copy of T, O(n*log(n))discard(k) -> None, remove k from T, if k is present, O(log(n))get(k[,d]) -> T[k] if k in T, else d, O(log(n))is_empty() -> True if len(T) == 0, O(1)items([reverse]) -> generator for (k, v) items of T, O(n)keys([reverse]) -> generator for keys of T, O(n)values([reverse]) -> generator for values of  T, O(n)pop(k[,d]) -> v, remove specified key and return the corresponding value, O(log(n))pop_item() -> (k, v), remove and return some (key, value) pair as a 2-tuple, O(log(n)) (synonym popitem() exist)set_default(k[,d]) -> value, T.get(k, d), also set T[k]=d if k not in T, O(log(n)) (synonym setdefault() exist)update(E) -> None.  Update T from dict/iterable E, O(E*log(n))foreach(f, [order]) -> visit all nodes of tree (0 = ‘inorder’, -1 = ‘preorder’ or +1 = ‘postorder’) and call f(k, v) for each node, O(n)iter_items(s, e[, reverse]) -> generator for (k, v) items of T for s <= key < e, O(n)remove_items(keys) -> None, remove items by keys, O(n)slicing by keysitem_slice(s, e[, reverse]) -> generator for (k, v) items of T for s <= key < e, O(n), synonym for iter_items(…)key_slice(s, e[, reverse]) -> generator for keys of T for s <= key < e, O(n)value_slice(s, e[, reverse]) -> generator for values of T for s <= key < e, O(n)T[s:e] -> TreeSlice object, with keys in range s <= key < e, O(n)del T[s:e] -> remove items by key slicing, for s <= key < e, O(n)start/end parameter:if ‘s’ is None or T[:e] TreeSlice/iterator starts with value of min_key();if ‘e’ is None or T[s:] TreeSlice/iterator ends with value of max_key();T[:] is a TreeSlice which represents the whole tree;The step argument of the regular slicing syntax T[s:e:step] will silently ignored.TreeSlice is a tree wrapper with range check and contains no references
to objects, deleting objects in the associated tree also deletes the object
in the TreeSlice.TreeSlice[k] -> get value for key k, raises KeyError if k not exists in range s:eTreeSlice[s1:e1] -> TreeSlice object, with keys in range s1 <= key < e1new lower bound is max(s, s1)new upper bound is min(e, e1)TreeSlice methods:items() -> generator for (k, v) items of T, O(n)keys() -> generator for keys of T, O(n)values() -> generator for values of  T, O(n)__iter__ <==> keys()__repr__ <==> repr(T)__contains__(key)-> True if TreeSlice has a key k, else False, O(log(n))prev/succ operationsprev_item(key) -> get (k, v) pair, where k is predecessor to key, O(log(n))prev_key(key) -> k, get the predecessor of key, O(log(n))succ_item(key) -> get (k,v) pair as a 2-tuple, where k is successor to key, O(log(n))succ_key(key) -> k, get the successor of key, O(log(n))floor_item(key) -> get (k, v) pair, where k is the greatest key less than or equal to key, O(log(n))floor_key(key) -> k, get the greatest key less than or equal to key, O(log(n))ceiling_item(key) -> get (k, v) pair, where k is the smallest key greater than or equal to key, O(log(n))ceiling_key(key) -> k, get the smallest key greater than or equal to key, O(log(n))Heap methodsmax_item() -> get largest (key, value) pair of T, O(log(n))max_key() -> get largest key of T, O(log(n))min_item() -> get smallest (key, value) pair of T, O(log(n))min_key() -> get smallest key of T, O(log(n))pop_min() -> (k, v), remove item with minimum key, O(log(n))pop_max() -> (k, v), remove item with maximum key, O(log(n))nlargest(i[,pop]) -> get list of i largest items (k, v), O(i*log(n))nsmallest(i[,pop]) -> get list of i smallest items (k, v), O(i*log(n))Set methods (using frozenset)intersection(t1, t2, …) -> Tree with keyscommonto all treesunion(t1, t2, …) -> Tree with keys fromeithertreesdifference(t1, t2, …) -> Tree with keys in T but not any of t1, t2, …symmetric_difference(t1) -> Tree with keys in either T and t1  but not bothis_subset(S) -> True if every element in T is in S (synonym issubset() exist)is_superset(S) -> True if every element in S is in T (synonym issuperset() exist)is_disjoint(S) ->  True if T has a null intersection with S (synonym isdisjoint() exist)Classmethodsfrom_keys(S[,v]) -> New tree with keys from S and values equal to v. (synonym fromkeys() exist)Helper functionsbintrees.has_fast_tree_support() -> True if Cython extension is working else False (False = using pure Python implementation)Installationfrom source:python setup.py installor from PyPI:pip install bintreesCompiling the fast Trees requires Cython and on Windows is a C-Compiler necessary.Download Binaries for Windowshttps://github.com/mozman/bintrees/releasesDocumentationthis README.rstbintrees can be found on GitHub.com at:https://github.com/mozman/bintrees.gitNEWSVersion 2.1.0 - 2020-01-02Usesortedcontainersinstead:https://pypi.python.org/pypi/sortedcontainersProject Status: Inactiveremoved official Python 2 supportVersion 2.0.7 - 2017-04-28BUGFIX: foreach (pure Python implementation) works with empty treesacquire GIL for PyMem_Malloc() and PyMem_Free() callsVersion 2.0.6 - 2017-02-04BUGFIX: correct deepcopy() for tree in treeVersion 2.0.5 - 2017-02-04support for copy.deepcopy()changed status back toMature, there will be: bugfixes, compatibility checks and simple additions like this deep
copy support, because I got feedback, that there are some special cases in whichbintreescan be useful.switched development to 64bit only & MS compilers - on Windows 7 everything works fine now with CPython 2.7/3.5/3.6Repository moved to GitHub:https://github.com/mozman/bintrees.gitVersion 2.0.4 - 2016-01-09removed logging statements on importadded helper function bintrees.has_fast_tree_support()HINT: pypy runs faster than CPython with Cython extensionVersion 2.0.3 - 2016-01-06replaced print function by logging.warning for import warning messagesKNOWN ISSUE: unable to build Cython extension with MingW32 and CPython 3.5 & CPython 2.7.10Version 2.0.2 - 2015-02-12fixed foreach cython-function by Sam YapleVersion 2.0.1 - 2013-10-01removed __del__() method to avoid problems with garbage collectionVersion 2.0.0 - 2013-06-01API change: consistent method naming with synonyms for dict/set compatibilitycode base refactoringremoved tree walkersremoved low level node stack implementation -> caused crashesoptimizations for pypy: iter_items(), succ_item(), prev_item()tested with CPython2.7, CPython3.3, pypy-2.0 on Win7 and Linux Mint 15 x64 (pypy-1.9)Version 1.0.3 - 2013-05-01extended iter_items(startkey=None, endkey=None, reverse=reverse) -> better performance for slicingCython implementation of iter_items() for Fast_X_Trees()added key parameterreverseto itemslice(), keyslice(), valueslice()tested with CPython2.7, CPython3.3, pypy-2.0Version 1.0.2 - 2013-04-01bug fix: FastRBTree data corruption on inserting existing keysbug fix: union & symmetric_difference - copy all values to result treeVersion 1.0.1 - 2013-02-01bug fixesrefactorings by graingertskip useless tests for pypynew license: MIT Licensetested with CPython2.7, CPython3.2, CPython3.3, pypy-1.9, pypy-2.0-beta1unified line endings to LFPEP8 refactoringsadded floor_item/key, ceiling_item/key methods, thanks to Dai MikurubeVersion 1.0.0 - 2011-12-29bug fixesstatus: 5 - Production/Stableremoved useless TreeIterator() class and T.treeiter() method.patch from Max Motovilov to use Visual Studio 2008 for building C-extensionsVersion 0.4.0 - 2011-04-14API change!!!full Python 3 support, also for Cython implementationsremoved user defined compare() function - keys have to be comparable!removed T.has_key(), use ‘key in T’keys(), items(), values() generating ‘views’removed iterkeys(), itervalues(), iteritems() methodsreplaced index slicing by key slicingremoved index() and item_at()repr() produces a correct representationinstalls on systems without cython (tested with pypy)new license: GNU Library or Lesser General Public License (LGPL)Version 0.3.2 - 2011-04-09added itemslice(startkey, endkey), keyslice(startkey, endkey),
valueslice(startkey, endkey) - slicing by keystested with pypy 1.4.1, damn fastPure Python trees are working with Python 3No Cython implementation for Python 3Version 0.3.1 - 2010-09-10runs with Python 2.7Version 0.3.0 - 2010-05-11low level functions written as c-module only interface to python is a cython
modulesupport for the pickle protocolVersion 0.2.1 - 2010-05-06added delslice del T[0:3] -> remove treenodes 0, 1, 2added discard -> remove key without KeyError if not foundadded heap methods: min, max, nlarges, nsmallest …added Set methods -> intersection, differnce, union, …added slicing: T[5:10] get items with position (not key!)  5, 6, 7, 8, 9T[5] get item with key! 5added index: T.index(key) -> get position of item <key>added item_at: T.item_at(0) -> get item at position (not key!) 0T.item_at(0) O(n)! <==> T.min_item() O(log(n))Version 0.2.0 - 2010-05-03TreeMixin Class as base for Python-Trees and as Mixin for Cython-TreesVersion 0.1.0 - 2010-04-27Alpha statusInitial release