ホームページ >バックエンド開発 >Python チュートリアル >Python での二分木検索アルゴリズム モジュールの使用ガイド

Python での二分木検索アルゴリズム モジュールの使用ガイド

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-16 08:43:261530ブラウズ

Python のバイナリ ツリー モジュールのコンテンツ:

BinaryTree: 不均衡な二分木
AVLTree: バランスの取れた AVL ツリー
RBTree: バランスの取れた赤黒ツリー
上記は python で書かれており、対応するモジュールは c で書かれており、Cython パッケージとして使用できます。

高速バイナリツリー
FastAVLTree
ファストRBツリー
ツリーは Python の組み込み dict クラスよりも遅い場合が多いですが、ツリー内のすべてのデータは特定のキーワードに従って並べ替えられるため、場合によっては使用する必要があることに注意してください。

インストールと使用

インストール方法

インストール環境:

ubuntu12.04、Python 2.7.6

インストール方法

ソース コードを次の場所からダウンロードします: https://bitbucket.org/mozman/bintrees/src
ソース コード ディレクトリに入り、setup.py ファイルを参照して、ディレクトリ
で実行します。

python setup.py install

インストールは成功しました。使用方法を見てみましょう。

アプリケーション

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)
  <class 'bintrees.bintree.BinaryTree'>


- キーと値のペアを 1 つずつ追加します: .__setitem__(k,v) .Complexity 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 を 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'})


- キーが存在するかどうかを確認します: .__contains__(k) キー k が含まれている場合は True を返し、そうでない場合は 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


- キーに基づいてキーと値を削除します: .__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'})

- キー値に基づいて kye の値を取得します: .__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 "<stdin>", line 1, in <module>
 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
 <generator object <genexpr> 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

- 最大のキーを持つ k-v ペアを検索します: .__max__()、キーごとに整理し、最大のキーを持つキーと値のペアを返します。


- 最小のキーを持つキーと値のペアを見つけます: .__min__()

例を参照:

>>> btree
 BinaryTree({2: 'phone', 7: 'computer', 9: 'scree'})
 >>> btree.__max__()
 (9, 'scree')
 >>> btree.__min__()
 (2, 'phone')

- 2 つのツリー間の関係演算

例を参照:

>>> 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)  #btree不与bother重叠的部分
 BinaryTree({2: 'phone', 9: 'scree'})
 
 >>> btree.__xor__(bother)  #两者非重叠部分
 BinaryTree({2: 'phone', 3: 'http://www.jb51.net, 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 "<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'

- キーに基づいて検索し、代替値を返すか、.get(key[,d]) を返します。ツリーに key が存在する場合は値を返し、存在しない場合は 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

- キーと値のループに基づいてツリーから値を取得します:

>>.items([reverse]) -- (キー, 値) 構造に従って;

>>.keys([reverse])--key

>>.values([reverse])--値。O(n)

>>.iter_items(s,e[,reverse]--s,e はキーの範囲であり、特定の範囲 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])、キーに従ってツリーデータを削除し、値を返しますが、d がなく、代わりの return d も指定されている場合は、d が返されます。 d がない場合、エラーが報告されます。

>>.pop_item() は、削除するツリー内の (キー、値) をランダムに選択して返します。

例を参照:

>>> 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 "<stdin>", line 1, in <module>
  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'
- データを検索して値を返します: .set_default(key[,d])、ツリー データ内でキーを検索し、存在する場合は値を返します。存在しない場合、d が指定されている場合は (key, d) がツリーに追加され、d が指定されていない場合は (key, None) が追加されます。

例を参照:

>>> 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 "<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']) #按照 列表中顺序逐个删除
 >>> ctree
 BinaryTree({8: 'eight', 9: 'scree'})

   
##以上只是入门的基本方法啦,还有更多内容,请移不到到文章开头的官方网站

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。