1 Binary Tree Package 2 =================== 3 4 Abstract 5 ======== 6 7 This package provides Binary- RedBlack- and AVL-Trees written in Python and Cython. 8 9 This Classes are much slower than the built-in dict class, but all 10 iterators/generators yielding data in sorted key order. 11 12 Source of Algorithms 13 -------------------- 14 15 AVL- and RBTree algorithms taken from Julienne Walker: http://eternallyconfuzzled.com/jsw_home.aspx 16 17 Trees written in Python (only standard library) 18 ----------------------------------------------- 19 20 - *BinaryTree* -- unbalanced binary tree 21 - *AVLTree* -- balanced AVL-Tree 22 - *RBTree* -- balanced Red-Black-Tree 23 24 Trees written with C-Functions and Cython as wrapper 25 ---------------------------------------------------- 26 27 - *FastBinaryTree* -- unbalanced binary tree 28 - *FastAVLTree* -- balanced AVL-Tree 29 - *FastRBTree* -- balanced Red-Black-Tree 30 31 All trees provides the same API, the pickle protocol is supported. 32 33 FastXTrees has C-structs as tree-node structure and C-implementation for low level 34 operations: insert, remove, get_value, max_item, min_item. 35 36 Constructor 37 ~~~~~~~~~~~ 38 39 * Tree() -> new empty tree; 40 * Tree(mapping) -> new tree initialized from a mapping (requires only an items() method) 41 * Tree(seq) -> new tree initialized from seq [(k1, v1), (k2, v2), ... (kn, vn)] 42 43 Methods 44 ~~~~~~~ 45 46 * __contains__(k) -> True if T has a key k, else False, O(log(n)) 47 * __delitem__(y) <==> del T[y], del[s:e], O(log(n)) 48 * __getitem__(y) <==> T[y], T[s:e], O(log(n)) 49 * __iter__() <==> iter(T) 50 * __len__() <==> len(T), O(1) 51 * __max__() <==> max(T), get max item (k,v) of T, O(log(n)) 52 * __min__() <==> min(T), get min item (k,v) of T, O(log(n)) 53 * __and__(other) <==> T & other, intersection 54 * __or__(other) <==> T | other, union 55 * __sub__(other) <==> T - other, difference 56 * __xor__(other) <==> T ^ other, symmetric_difference 57 * __repr__() <==> repr(T) 58 * __setitem__(k, v) <==> T[k] = v, O(log(n)) 59 * clear() -> None, remove all items from T, O(n) 60 * copy() -> a shallow copy of T, O(n*log(n)) 61 * discard(k) -> None, remove k from T, if k is present, O(log(n)) 62 * get(k[,d]) -> T[k] if k in T, else d, O(log(n)) 63 * is_empty() -> True if len(T) == 0, O(1) 64 * items([reverse]) -> generator for (k, v) items of T, O(n) 65 * keys([reverse]) -> generator for keys of T, O(n) 66 * values([reverse]) -> generator for values of T, O(n) 67 * pop(k[,d]) -> v, remove specified key and return the corresponding value, O(log(n)) 68 * popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple, O(log(n)) 69 * setdefault(k[,d]) -> T.get(k, d), also set T[k]=d if k not in T, O(log(n)) 70 * update(E) -> None. Update T from dict/iterable E, O(E*log(n)) 71 * 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) 72 73 slicing by keys 74 ~~~~~~~~~~~~~~~ 75 76 * itemslice(s, e) -> generator for (k, v) items of T for s <= key < e, O(n) 77 * keyslice(s, e) -> generator for keys of T for s <= key < e, O(n) 78 * valueslice(s, e) -> generator for values of T for s <= key < e, O(n) 79 * T[s:e] -> TreeSlice object, with keys in range s <= key < e, O(n) 80 * del T[s:e] -> remove items by key slicing, for s <= key < e, O(n) 81 82 start/end parameter: 83 84 * if 's' is None or T[:e] TreeSlice/iterator starts with value of min_key(); 85 * if 'e' is None or T[s:] TreeSlice/iterator ends with value of max_key(); 86 * T[:] is a TreeSlice which represents the whole tree; 87 88 TreeSlice is a tree wrapper with range check, and contains no references 89 to objects, deleting objects in the associated tree also deletes the object 90 in the TreeSlice. 91 92 * TreeSlice[k] -> get value for key k, raises KeyError if k not exists in range s:e 93 * TreeSlice[s1:e1] -> TreeSlice object, with keys in range s1 <= key < e1 94 - new lower bound is max(s, s1) 95 - new upper bound is min(e, e1) 96 97 TreeSlice methods: 98 99 * items() -> generator for (k, v) items of T, O(n) 100 * keys() -> generator for keys of T, O(n) 101 * values() -> generator for values of T, O(n) 102 * __iter__ <==> keys() 103 * __repr__ <==> repr(T) 104 * __contains__(key)-> True if TreeSlice has a key k, else False, O(log(n)) 105 106 prev/succ operations 107 ~~~~~~~~~~~~~~~~~~~~ 108 109 * prev_item(key) -> get (k, v) pair, where k is predecessor to key, O(log(n)) 110 * prev_key(key) -> k, get the predecessor of key, O(log(n)) 111 * succ_item(key) -> get (k,v) pair as a 2-tuple, where k is successor to key, O(log(n)) 112 * succ_key(key) -> k, get the successor of key, O(log(n)) 113 * floor_item(key) -> get (k, v) pair, where k is the greatest key less than or equal to key, O(log(n)) 114 * floor_key(key) -> k, get the greatest key less than or equal to key, O(log(n)) 115 * ceiling_item(key) -> get (k, v) pair, where k is the smallest key greater than or equal to key, O(log(n)) 116 * ceiling_key(key) -> k, get the smallest key greater than or equal to key, O(log(n)) 117 118 Heap methods 119 ~~~~~~~~~~~~ 120 121 * max_item() -> get largest (key, value) pair of T, O(log(n)) 122 * max_key() -> get largest key of T, O(log(n)) 123 * min_item() -> get smallest (key, value) pair of T, O(log(n)) 124 * min_key() -> get smallest key of T, O(log(n)) 125 * pop_min() -> (k, v), remove item with minimum key, O(log(n)) 126 * pop_max() -> (k, v), remove item with maximum key, O(log(n)) 127 * nlargest(i[,pop]) -> get list of i largest items (k, v), O(i*log(n)) 128 * nsmallest(i[,pop]) -> get list of i smallest items (k, v), O(i*log(n)) 129 130 Set methods (using frozenset) 131 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 132 133 * intersection(t1, t2, ...) -> Tree with keys *common* to all trees 134 * union(t1, t2, ...) -> Tree with keys from *either* trees 135 * difference(t1, t2, ...) -> Tree with keys in T but not any of t1, t2, ... 136 * symmetric_difference(t1) -> Tree with keys in either T and t1 but not both 137 * issubset(S) -> True if every element in T is in S 138 * issuperset(S) -> True if every element in S is in T 139 * isdisjoint(S) -> True if T has a null intersection with S 140 141 Classmethods 142 ~~~~~~~~~~~~ 143 144 * fromkeys(S[,v]) -> New tree with keys from S and values equal to v. 145 146 Performance 147 =========== 148 149 Profiling with timeit(): 5000 unique random int keys, time in seconds 150 151 ======================== ============= ============== ============== ============== 152 unbalanced Trees CPython 2.7.2 FastBinaryTree ipy 2.7.0 pypy 1.7.0 153 ======================== ============= ============== ============== ============== 154 build time 100x 7,55 0,60 2,51 0,29 155 build & delete time 100x 13,34 1,48 4,45 0,47 156 search 100x all keys 2,86 0,96 0,27 0,06 157 ======================== ============= ============== ============== ============== 158 159 ======================== ============= ============== ============== ============== 160 AVLTrees CPython 2.7.2 FastAVLTree ipy 2.7.0 pypy 1.7.0 161 ======================== ============= ============== ============== ============== 162 build time 100x 22,66 0,65 10,45 1,29 163 build & delete time 100x 36,71 1,47 20,89 3,02 164 search 100x all keys 2,34 0,85 0,89 0,14 165 ======================== ============= ============== ============== ============== 166 167 ======================== ============= ============== ============== ============== 168 RBTrees CPython 2.7.2 FastRBTree ipy 2.7.0 pypy 1.7.0 169 ======================== ============= ============== ============== ============== 170 build time 100x 14,78 0,65 4,43 0,49 171 build & delete time 100x 39,34 1,63 12,43 1,32 172 search 100x all keys 2,32 0,86 0,86 0,13 173 ======================== ============= ============== ============== ============== 174 175 News 176 ==== 177 178 Version 1.0.1 February 2013 179 180 * bug fixes 181 * refactorings by graingert 182 * skip useless tests for pypy 183 * new license: MIT License 184 * tested with CPython2.7, CPython3.2, CPython3.3, pypy-1.9, pypy-2.0-beta1 185 * unified line endings to LF 186 * PEP8 refactorings 187 * added floor_item/key, ceiling_item/key methods, thanks to Dai Mikurube 188 189 Version 1.0.0 190 191 * bug fixes 192 * status: 5 - Production/Stable 193 * removed useless TreeIterator() class and T.treeiter() method. 194 * patch from Max Motovilov to use Visual Studio 2008 for building C-extensions 195 196 Version 0.4.0 197 198 * API change!!! 199 * full Python 3 support, also for Cython implementations 200 * removed user defined compare() function - keys have to be comparable! 201 * removed T.has_key(), use 'key in T' 202 * keys(), items(), values() generating 'views' 203 * removed iterkeys(), itervalues(), iteritems() methods 204 * replaced index slicing by key slicing 205 * removed index() and item_at() 206 * repr() produces a correct representation 207 * installs on systems without cython (tested with pypy) 208 * new license: GNU Library or Lesser General Public License (LGPL) 209 210 Installation 211 ============ 212 213 from source:: 214 215 python setup.py install 216 217 Download 218 ======== 219 220 http://bitbucket.org/mozman/bintrees/downloads 221 222 Documentation 223 ============= 224 225 this README.txt 226 227 bintrees can be found on bitbucket.org at: 228 229 http://bitbucket.org/mozman/bintrees 230