Two-fork Tree module contents in Python:
BinaryTree: Non-balanced two-fork tree
Avltree: A balanced AVL tree
Rbtree: A balanced red-black tree
The above is written in Python, and the Physiognomy module is written in C and can be used as a Cython package.
Fastbinarytree
Fastavltree
Fastrbtree
It is particularly important to note that trees tend to be slower than Python-built dict classes, but all of the data in it is sorted by a keyword, so it must be used in some cases.
Installation and use
Installation method
Installation Environment:
ubuntu12.04, Python 2.7.6
Installation method
Download source, Address: https://bitbucket.org/mozman/bintrees/src
Access to the source directory, see setup.py file, run in the directory
Installation is successful, ok! below to see how to use.
Application
The bintrees provides a rich API that covers a wide range of common applications. The following article explains its application.
-Reference
If you follow the general modular approach, enter the following command to introduce the above module
Wrong, this is wrong, appear the following warning: (XXX is not available, with XXX)
Warning:fastbinarytree not available, using Python version BinaryTree.
Warning:fastavltree not available, using Python version avltree.
Warning:fastrbtree not available, using Python version rbtree.
The correct way to introduce it is:
>>> from bintrees import BinaryTree #只引入了BinartTree
>>> bintrees import * #三个模块都引入了
-Instantiated
See Example:
>>> btree = BinaryTree ()
>>> btree
BinaryTree ({})
>>> type (btree)
<class ' Bintrees.bintree.BinaryTree ' >
-Add key value pairs:. __setitem__ (k,v). Complexity O (log (n)) (in subsequent instructions, there will be a complexity indicator, for simplicity, directly labeled: O (log (n)).)
See Example:
>>> btree.__setitem__ ("Tom", "headmaster")
>>> btree
BinaryTree ({' Tom ': ' Headmaster '})
>>> btree.__setitem__ ("blog", "Http://blog.csdn.net/qiwsir")
>>> btree
BinaryTree ( {' Tom ': ' Headmaster ', ' blog ': ' Http://blog.csdn.net/qiwsir '})
-Bulk add:. Update (E) e is dict/iterable, the e batch is updated into Btree. O (E*log (n))
See Example:
>>> adict = [(2, "Phone"), (5, "Tea"), (9, "scree"), (7, "Computer")]
>>> btree.update (adict)
>>> btree
BinaryTree ({2: ' Phone ', 5: ' Tea ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' http:// Blog.csdn.net/qiwsir '})
-Find whether a key exists:. __contains__ (k) Returns True if it contains a key k, otherwise returns false. O (log (n))
See Example:
>>> btree
BinaryTree ({2: ' Phone ', 5: ' Tea ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' http://b Log.csdn.net/qiwsir '})
>>> btree.__contains__ (5)
True
>>> btree.__contains__ ("blog ")
True
>>> btree.__contains__ (" Qiwsir ")
False
>>> btree.__contains__ (1)
False
-delete a key-value from key:. __delitem__ (Key), O (log (n))
See Example:
>>> btree
BinaryTree ({2: ' Phone ', 5: ' Tea ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' http:// Blog.csdn.net/qiwsir '})
>>> btree.__delitem__ (5) #删除key The key-value of =5, that is: 5: ' Tea ' was removed.
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' http:// Blog.csdn.net/qiwsir '})
-Gets the value of the Kye according to the key value:. __getitem__ (Key)
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' Http://blog.csdn . Net/qiwsir '})
>>> btree.__getitem__ ("blog")
' Http://blog.csdn.net/qiwsir '
>>> btree.__getitem__ (7)
' computer '
>>> btree._getitem__ (5) #在btree中没有key = 5, so the error is not correct.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
attributeerror: ' BinaryTree ' object has no attribute ' _getitem__ '
-iterator:. __ITER__ ()
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' Http://blog.csdn . Net/qiwsir '})
>>> aiter = btree.__iter__ ()
>>> aiter
<generator Object <genexpr > at 0xb7416dec>
>>> aiter.next () #注意: After Next (), this value is removed from the list
2
>>> aiter.next ()
7
>>> list (aiter)
[9, ' Tom ', ' blog ']
>>> list (aiter) #结果是空
[]
>>> bool (aiter) #but, is true
-The length of the tree's data:. __LEN__ (), which returns the length of the btree. O (1)
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' Tom ': ' Headmaster ', ' blog ': ' http:// Blog.csdn.net/qiwsir '})
>>> btree.__len__ ()
5
-Find the key's largest k-v pair:. __max__ (), sorted by key, returns the key's largest value pair.
-Find key value pairs that are minimal:. __MIN__ ()
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '})
>>> btree.__max__ ()
(9, ' Scree ')
>>> btree.__min__ ()
(2, ' phone ')
-the relational operation of two trees
See Example:
>>> other = [(3, ' http://www.jb51.net '), (7, ' Qiwsir ')]
>>> bother = BinaryTree () #再建一个树
>>> Bother.update (Other) #加入数据
>>> bother
BinaryTree ({3: ' Http://www.jb51.net ', 7: ' Qiwsir '})
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '})
>>> Btree.__and __ (bother) #重叠部分部分
BinaryTree ({7: ' computer '})
>>> btree.__or__ (bother) #全部
BinaryTree ({2: ' Phone ', 3: ' Http://www.jb51.net, 7: ' Computer ', 9: ' scree '})
>>> btree.__sub__ (bother) c14/> #btree不与bother重叠的部分
BinaryTree ({2: ' phone ', 9: ' scree '})
>>> btree.__xor__ (bother) # Both non-overlapping parts
BinaryTree ({2: ' Phone ', 3: ' Http://www.jb51.net, 9: ' Scree '})
-Output string appearance, note only the appearance of the output:. __REPR__ ()
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '})
>>> btree.__repr__ ()
" BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' Scree '})
-Empty all data in the tree:. Clear (), O (log (n))
See Example:
>>> bother
BinaryTree ({3: ' Http://blog.csdn.net/qiwsir ', 7: ' Qiwsir '})
>>> bother.clear ()
>>> bother
BinaryTree ({})
>>> bool (bother)
False
-Light copy:. Copy (), the official document says it's a shallow copy, but I did the implementation of the operation, as shown below, not quite understand its "shallow" meaning. O (N*log (n))
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '})
>>> ctree = btree.copy ()
>>> ctree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '})
>>> btree.__setitem__ ("GitHub "," Qiwsir ") #增加btree的数据
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> ctree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree '}) #这是不是在说明属于深拷贝呢?
>>> ctree.__delitem__ (7) #删除ctree的一个数据
>>> ctree
BinaryTree ({2: ' phone ', 9: ' Scree '})
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
-Remove one of the data in the tree:. Discard (key), which is similar to. __delitem__ (key). Values are not undone. O (log (n))
See Example:
>>> ctree
BinaryTree ({2: ' phone ', 9: ' scree '})
>>> Ctree.discard (2) #删除后, do not return a value, or return none
>>> Ctree
BinaryTree ({9: ' scree '})
>>> Ctree.discard (2) #如果删除的key不存在, also returns none
>>> Ctree.discard (3)
>>> ctree.__delitem__ (3) #但是,. __delitem__ (key) is different, if the key does not exist, will be an error.
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/bintrees/ abctree.py ", line 264, in __delitem__
self.remove (key)
File/usr/local/lib/python2.7/site-packages/ bintrees/bintree.py ", line 124, in remove
raise Keyerror (str (key))
Keyerror: ' 3 '
-Find by key and return or return an alternate value:. Get (Key[,d]). Returns value if the key exists in the tree, otherwise, if D, returns a D value. O (log (n))
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> Btree.get (2, "algorithm")
' phone '
>>> btree.get ("Python", "algorithm") #没有key = ' python ' value, return ' Algorithm '
algorithm '
>>> btree.get ("python") #如果不指定第二个参数, if not found, return none
>>>
-Determine if the tree is empty: Is_empty (). Based on the length of the tree data, NULL if the data length is 0. O (1)
See Example:
>>> ctree
BinaryTree ({9: ' scree '})
>>> ctree.clear () #清空数据
>>> Ctree
BinaryTree ({})
>>> ctree.is_empty ()
True
>>> btree
BinaryTree ({ 2: ' Phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '}
>>> btree.is_empty ()
False
-values are taken from the tree according to the key, value loop:
>>.items ([reverse])--value in accordance with (KEY,VALUE) structure;
>>.keys ([reverse])--key
>>.values ([reverse])--value. O (N)
>>.iter_items (S,e[,reverse]--s,e is the scope of the key, that is, the iterator O (n) that generates the key within a range
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> for (k,v In Btree.items ():
... print k,v ...
2 Phone
7 computer
9 scree
GitHub Qiwsir
>>> for K in Btree.keys ():
... print k
. C12/>2
7
9
GitHub
>>> for V in Btree.values ():
... print v.
Phone
computer
scree
qiwsir
>>> for (k,v) in Btree.items (reverse=true): #反序
... Print K,v ...
GitHub Qiwsir
9 scree
7 computer
2 phone
>>> btree
BinaryTree ({2: ' phone ', 5:none, 7 : ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> for (k,v) in Btree.iter_items (6,9): #要求迭代6 =key<9 the key value of the data
... print k,v ...
7 Computer
8 eight
>>>
-Deletes the data and returns the value:
>>.pop (Key[,d]), which deletes the tree's data according to the key and returns the value, but if not, and also specifies the alternative return d, returns D, if there is no d, the error;
>>.pop_item (), randomly selected (Key,value) in the tree is deleted and returned.
See Example:
>>> ctree = btree.copy ()
>>> ctree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ') : ' Qiwsir '}
>>> Ctree.pop (2) #删除key the =2 data, return its value
' phone '
>>> ctree.pop (2) # Delete a nonexistent key, error
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr" /local/lib/python2.7/site-packages/bintrees/abctree.py ", line, in pop
value = Self.get_value (key)
File" /usr/local/lib/python2.7/site-packages/bintrees/abctree.py ", line 557, in Get_value
raise Keyerror (str (key))
keyerror: ' 2 '
>>> ctree.pop_item () #随机返回一个 (Key,value), and deleted
(7, ' computer ')
>>> ctree
BinaryTree ({9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> Ctree.pop (7, "sing") #如果没有, Can return the specified value
' sing '
-Finds the data and returns value:. Set_default (Key[,d]), finds the key in the tree's data, and returns the value if it exists. If it does not exist, when D is specified, the (key,d) is added to the tree, and (key,none) is added when D is not specified. O (log (n))
See Example:
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
>>> Btree.set_default (7) #存在则返回
' computer '
>>> btree.set_default (8, "eight") #不存在, then return the reserved specified value and add to the tree
' Eight '
>>> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '}) C8/>>>> Btree.set_default (5) #如果不指定值, then add None
>>> btree
BinaryTree ({2: ' phone ', 5:none, 7 : ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '} '
>>> btree.get (2) #注意,. Get (key) and. Set_default ( KEY[,D]) The difference between
' phone '
>>> btree.get (3, "mobile") #不存在的 key, returns but does not add to the tree
' mobile '
> >> btree
BinaryTree ({2: ' phone ', 7: ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
-delete value based on key
>>.remove (key), deleting (Key,value)
>>.remove_items (keys), keys is a list of key, delete the corresponding data in the tree
See Example:
>>> ctree
BinaryTree ({2: ' phone ', 5:none, 7: ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '})
&G T;>> Ctree.remove_items ([5,6]) #key = 6, not present, error
Traceback (most recent call last):
File "<stdin > ", Line 1, in <module>
File"/usr/local/lib/python2.7/site-packages/bintrees/abctree.py ", line 271, in Remove_items
self.remove (key)
File "/usr/local/lib/python2.7/site-packages/bintrees/bintree.py", line 124 , in Remove
raise Keyerror (str (key))
Keyerror: ' 6 '
>>> ctree
BinaryTree ({2: ' phone ', 7: ' Computer ', 8: ' Eight ', 9: ' scree ', ' GitHub ': ' Qiwsir '} '
>>> ctree.remove_items ([2,7, ' GitHub ']) #按照 Sequential deletion in list
>>> ctree
BinaryTree ({8: ' Eight ', 9: ' Scree '})
# #以上只是入门的基本方法啦, there's more, please don't move to the official website at the beginning of the article