#é®é¢
Pythonä¸çäºåæ æ¥æ¾ç®æ³æ¨¡å
#æè·¯è¯´æ
äºåæ æ¥æ¾ç®æ³ï¼å¨å¼åå®è·µä¸ï¼ä¼ç»å¸¸ç¨å°ãæç
§æ¯ä¾ï¼å¯¹äºè¿ä¹ä¸ä¸ªå¸¸ç¨çä¸è¥¿ï¼Pythonä¸å®ä¼æä¾è½®åçãæ¯çï¼pythonå°±æ¯è¿æ ·ï¼ä¸å®ä¼è®©å¼åè
çå¿ï¼éä½å¼åè
çå·¥ä½ååã
pythonä¸çäºåæ æ¨¡åå
容ï¼
- BinaryTreeï¼é平衡äºåæ
- AVLTreeï¼å¹³è¡¡çAVLæ
- RBTreeï¼å¹³è¡¡ççº¢é»æ
以䏿¯ç¨pythonåçï¼ç¸é¢çæ¨¡åæ¯ç¨cåçï¼å¹¶ä¸å¯ä»¥å为Cythonçå
ã
- FastBinaryTree
- FastAVLTree
- FastRBTree
**ç¹å«éè¦è¯´æçæ¯ï¼æ å¾å¾è¦æ¯pythonå
ç½®çdictç±»æ
¢ä¸äºï¼ä½æ¯å®ä¸çæææ°æ®é½æ¯æç
§æä¸ªå
³é®è¯è¿è¡æåºçï¼æ
å¨æäºæ
åµä¸æ¯å¿
须使ç¨çã**
#å®è£
å使ç¨
##å®è£
æ¹æ³
###å®è£
ç¯å¢ï¼
ubuntu12.04, python 2.7.6
###å®è£
æ¹æ³
- ä¸è½½æºç ï¼å°åï¼https://bitbucket.org/mozman/bintrees/src
- è¿å
¥æºç ç®å½ï¼çå°setup.pyæä»¶ï¼å¨è¯¥ç®å½å
è¿è¡
python setup.py install
å®è£
æåï¼ok!ä¸é¢å°±çå¦ä½ä½¿ç¨äºã
###åºç¨
bintreesæä¾äºä¸°å¯çAPI,æ¶µçäºé常çå¤ç§åºç¨ãä¸é¢éæ¡è¯´æå
¶åºç¨ã
- å¼ç¨
妿æç
§ä¸è¬æ¨¡åçæè·¯ï¼è¾å
¥ä¸é¢çå½ä»¤å¼å
¥ä¸è¿°æ¨¡å
>>> import bintrees
éäºï¼è¿æ¯éçï¼åºç°å¦ä¸è¦åï¼(ÃÃÃä¸å¯ç¨ï¼ç¨ÃÃÃï¼
Warning: FastBinaryTree not available, using Python version BinaryTree.
Warning: FastAVLTree not available, using Python version AVLTree.
Warning: FastRBTree not available, using Python version RBTree.
æ£ç¡®çå¼å
¥æ¹å¼æ¯ï¼
>>> from bintrees import BinaryTree #åªå¼å
¥äºBinartTree
>>> from bintrees import * #ä¸ä¸ªæ¨¡åé½å¼å
¥äº
- å®ä¾å
çä¾åï¼
>>> btree = BinaryTree()
>>> btree
BinaryTree({})
>>> type(btree)
- é个å¢å é®å¼å¯¹ï¼.__setitem__(k,v) .å¤æåº¦O(log(n))(åç»è¯´æä¸ï¼é½ä¼æå¤æåº¦æ 示ï¼ä¸ºäºç®åï¼ç´æ¥æ æï¼O(log(n)).)
çä¾åï¼
>>> 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'})
- æ¹éæ·»å ï¼.update(E) Eæ¯dict/iterableï¼å°Eæ¹éæ´æ°å
¥btree. O(E*log(n))
çä¾åï¼
>>> 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'})
- æ¥æ¾æä¸ªkeyæ¯å¦åå¨ï¼.__contains__(k) 妿嫿é®kï¼åè¿åTrue,å¦åè¿åFalse. O(log(n))
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 5: 'tea', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
>>> btree.__contains__(5)
True
>>> btree.__contains__("blog")
True
>>> btree.__contains__("qiwsir")
False
>>> btree.__contains__(1)
False
- æ ¹æ®keyå é¤æä¸ªkey-valueï¼.__delitem__(key), O(log(n))
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 5: 'tea', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
>>> btree.__delitem__(5) #å é¤key=5çkey-value,å³ï¼5:'tea' 被å é¤.
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
- æ ¹æ®keyå¼å¾å°è¯¥kyeçvalueï¼.__getitem__(key)
çä¾åï¼
>>> 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ï¼äºæ¯æ¥éã
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'BinaryTree' object has no attribute '_getitem__'
- è¿ä»£å¨ï¼.__iter__()
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
>>> aiter = btree.__iter__()
>>> aiter
at 0xb7416dec>
>>> aiter.next() #注æï¼next()ä¸ä¸ªä¹åï¼è¯¥å¼ä»listä¸å é¤
2
>>> aiter.next()
7
>>> list(aiter)
[9, 'Tom', 'blog']
>>> list(aiter) #ç»ææ¯ç©º
[]
>>> bool(aiter) #but,is True
True
- æ°çæ°æ®é¿åº¦ï¼.__len__(),è¿åbtreeçé¿åº¦ãO(1)
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'Tom': 'headmaster', 'blog': 'http://blog.csdn.net/qiwsir'})
>>> btree.__len__()
5
- æ¾åºkeyæå¤§çk-v对ï¼.__max__(),æç
§keyæåï¼è¿åkeyæå¤§çé®å¼å¯¹ã
- æ¾åºkeyæå°çé®å¼å¯¹ï¼.__min__()
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})
>>> btree.__max__()
(9, 'scree')
>>> btree.__min__()
(2, 'phone')
- 两棵æ çå
³ç³»è¿ç®
çä¾åï¼
>>> other = [(3,'http://blog.csdn.net/qiwsir'),(7,'qiwsir')]
>>> bother = BinaryTree() #å建ä¸ä¸ªæ
>>> bother.update(other) #å å
¥æ°æ®
>>> bother
BinaryTree({3: 'http://blog.csdn.net/qiwsir', 7: 'qiwsir'})
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})
>>> btree.__and__(bother) #éå é¨åé¨å
BinaryTree({7: 'computer'})
>>> btree.__or__(bother) #å
¨é¨
BinaryTree({2: 'phone', 3: 'http://blog.csdn.net/qiwsir', 7: 'computer', 9: 'scree'})
>>> btree.__sub__(bother) #btreeä¸ä¸botheréå çé¨å
BinaryTree({2: 'phone', 9: 'scree'})
>>> btree.__xor__(bother) #两è
ééå é¨å
BinaryTree({2: 'phone', 3: 'http://blog.csdn.net/qiwsir', 9: 'scree'})
- è¾åºåç¬¦ä¸²æ¨¡æ ·ï¼æ³¨æä»
ä»
æ¯è¾åºçæ¨¡æ ·ç½¢äºï¼.__repr__()
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})
>>> btree.__repr__()
"BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})"
- æ¸
空æ ä¸çæææ°æ®:.clear(),O(log(n))
çä¾åï¼
>>> bother
BinaryTree({3: 'http://blog.csdn.net/qiwsir', 7: 'qiwsir'})
>>> bother.clear()
>>> bother
BinaryTree({})
>>> bool(bother)
False
- æµ
æ·è´ï¼.copy(),宿¹ææ¡£ä¸è¯´æ¯æµ
æ·è´ï¼ä½æ¯æåäºæä½å®ç°ï¼æ¯ä¸é¢æç¤ºï¼è¿ä¸æ¯å¾çè§£å
¶âæµ
âçå«ä¹ãO(n*log(n))
çä¾åï¼
>>> 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'})
- ç§»é¤æ ä¸çä¸ä¸ªæ°æ®ï¼.discard(key)ï¼è¿ä¸ªåè½ä¸.__delitem__(key)类似.两è
é½ä¸åæå¼ãO(log(n))
çä¾åï¼
>>> ctree
BinaryTree({2: 'phone', 9: 'scree'})
>>> ctree.discard(2) #å é¤åï¼ä¸è¿åå¼ï¼æè
è¿åNone
>>> ctree
BinaryTree({9: 'scree'})
>>> ctree.discard(2) #妿å é¤çkeyä¸åå¨ï¼ä¹è¿åNone
>>> ctree.discard(3)
>>> ctree.__delitem__(3) #使¯ï¼.__delitem__(key)åä¸åï¼å¦ækeyä¸åå¨ï¼ä¼æ¥éã
Traceback (most recent call last):
File "", line 1, in
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'
- æ ¹æ®keyæ¥æ¾ï¼å¹¶è¿åæè¿åå¤ç¨å¼ï¼.get(key[,d])ã妿key卿 ä¸åå¨ï¼åè¿åvalue,å¦å妿ædï¼åè¿ådå¼ãO(log(n))
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'})
>>> btree.get(2,"algorithm")
'phone'
>>> btree.get("python","algorithm") #没ækey='python'çå¼ï¼è¿å'algorithm'
'algorithm'
>>> btree.get("python") #妿䏿å®ç¬¬äºä¸ªåæ°ï¼è¥æ¥ä¸å°ï¼åè¿åNone
>>>
- å¤ææ æ¯å¦ä¸ºç©ºï¼is_empty().æ ¹æ®æ æ°æ®çé¿åº¦ï¼å¦ææ°æ®é¿åº¦ä¸º0,å为空ãO(1)
çä¾åï¼
>>> 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
- æ ¹æ®keyãvalue循ç¯ä»æ ä¸åå¼ï¼
>>.items([reverse])--æç
§(key,value)ç»æåå¼;
>>.keys([reverse])--key
>>.values([reverse])--value. O(n)
>>.iter_items(s,e[,reverse]--s,eæ¯keyçèå´ï¼ä¹å°±æ¯çæå¨æä¸ªèå´å
çkeyçè¿ä»£å¨ O(n)
çä¾åï¼
>>> 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
...
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çé®å¼å¯¹æ°æ®
... print k,v
...
7 computer
8 eight
>>>
- å 餿°æ®å¹¶è¿å该å¼ï¼
>>.pop(key[,d]), æ ¹æ®keyå 餿 çæ°æ®ï¼å¹¶è¿å该valueï¼ä½æ¯å¦ææ²¡æï¼å¹¶ä¹æå®äºå¤éè¿åçdï¼åè¿ådï¼å¦ææ²¡ædï¼åæ¥éï¼
>>.pop_item(),卿 ä¸éæºéæ©(key,value)å é¤ï¼å¹¶è¿åã
çä¾åï¼
>>> ctree = btree.copy()
>>> ctree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'})
>>> ctree.pop(2) #å é¤key=2çæ°æ®ï¼è¿åå
¶value
'phone'
>>> ctree.pop(2) #å é¤ä¸ä¸ªä¸åå¨çkeyï¼æ¥é
Traceback (most recent call last):
File "", line 1, in
File "/usr/local/lib/python2.7/site-packages/bintrees/abctree.py", line 350, 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),å¹¶å·²å é¤ä¹
(7, 'computer')
>>> ctree
BinaryTree({9: 'scree', 'github': 'qiwsir'})
>>> ctree.pop(7,"sing") #å¦ææ²¡æï¼å¯ä»¥è¿åæå®å¼
'sing'
- æ¥æ¾æ°æ®,å¹¶è¿åvalueï¼.set_default(key[,d])ï¼å¨æ çæ°æ®ä¸æ¥æ¾key,妿åå¨ï¼åè¿å该valueã妿ä¸åå¨ï¼å½æå®äºd,åå°è¯¥ï¼key,dï¼æ·»å å°æ å
ï¼å½ä¸æå®dçæ¶åï¼æ·»å (key,None). O(log(n))
çä¾åï¼
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 9: 'scree', 'github': 'qiwsir'})
>>> btree.set_default(7) #åå¨åè¿å
'computer'
>>> btree.set_default(8,"eight") #ä¸åå¨ï¼åè¿åå夿å®å¼ï¼å¹¶å å
¥å°æ
'eight'
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'})
>>> btree.set_default(5) #妿䏿å®å¼ï¼åä¼å å
¥None
>>> btree
BinaryTree({2: 'phone', 5: None, 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'})
>>> btree.get(2) #注æï¼.get(key)ä¸.set_default(key[,d])çåºå«
'phone'
>>> btree.get(3,"mobile") #ä¸åå¨ç key,è¿åä½ä¸å¢å å°æ
'mobile'
>>> btree
BinaryTree({2: 'phone', 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'})
- æ ¹æ®keyå é¤å¼
>>.remove(key),å é¤(key,value)
>>.remove_items(keys),keysæ¯ä¸ä¸ªkeyç»æçlist,é个å 餿 ä¸çå¯¹åºæ°æ®
çä¾åï¼
>>> ctree
BinaryTree({2: 'phone', 5: None, 7: 'computer', 8: 'eight', 9: 'scree', 'github': 'qiwsir'})
>>> ctree.remove_items([5,6]) #key=6ï¼ä¸åå¨ï¼æ¥é
Traceback (most recent call last):
File "", line 1, in
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']) #æç
§ å表ä¸é¡ºåºé个å é¤
>>> ctree
BinaryTree({8: 'eight', 9: 'scree'})
###以ä¸åªæ¯å
¥é¨çåºæ¬æ¹æ³å¦ï¼è¿ææ´å¤å
容ï¼è¯·ç§»ä¸å°å°æç« å¼å¤´ç宿¹ç½ç«ã