SlideShare uma empresa Scribd logo
1 de 18
アルゴリズムとデータ構
造
7.「2分探索木」
2011 年 4 月 26 日(火)
服部 健太
2011/4/26 アルゴリズムとデータ構造 7 2
概要
 2分探索木の性質について説明する
 2分探索木による探索,挿入,削除のアルゴ
リズムについて説明する.
2011/4/26 アルゴリズムとデータ構造 7 3
2分探索木
 単純だが効率が良いのでよく使われる
 2分探索木を作るには
 2分木のノードに1つずつデータ(キー)を入れる
 このとき,次のような関係を満たすようにする.
 x を2分探索木のあるノードとする.
 もし, y が x の左部分木の中にあるノードなら
ば, y.key x.key≦
 もし, y が x の右部分木の中にあるノードなら
ば, x.key y.key≦
 要するに,あるノードから見て左側の子孫のデータ
すべてが,このノードのデータより小さく,逆に右
側の子孫のデータはすべて大きいような2分木のこ
とである
2011/4/26 アルゴリズムとデータ構造 7 4
2分探索木の例
 データが {1, 2, 8, 9, 10, 12, 15, 20, 25, 30} の場合の例:
 練習問題
 {1,2,3} の3つの値からなる2分探索木をすべて描け
 (ヒント:全部で 5 種類あるはず)
20
2
1 9
15
25
30
8 12
10
2011/4/26 アルゴリズムとデータ構造 7 5
2分探索木の特徴
 間順走査( in-order traversal )で木を辿りな
がら,データを出力すると,出力されたデー
タは順序どおりに並ぶ
 各自,先ほど描いた図に対して,確認してみよ
2011/4/26 アルゴリズムとデータ構造 7 6
2分探索木の実現
 2分探索木
 木のルートを保持するフィールド root を1つだけ持つレ
コード
 def btree(): return record([‘root’])
 2分探索木のノード
 以下の 4 つのフィールドを持つレコード
 left
 左部分木のノード
 right
 右部分木のノード
 key
 レコードのキー
 data
 レコードのデータ
 def btnode(): return record([‘left’, ‘right’, ‘key’, ‘data’])
5
left right
key data
root
bt:
1 8
2
2011/4/26 アルゴリズムとデータ構造 7 7
2分探索木の実現(2)
 表の探索
 見つかったら該当するノード,見つからなかったら None
を返す
def search(node, key):
if node == None or key == node.key:
return node
if key < node.key:
return search(node.left, key)
else:
return search(node.right, key)
 search(BT.root, x) の形で呼び出す
2011/4/26 アルゴリズムとデータ構造 7 8
実験
 p.6 に図示した2分探索木を作成して, search してみる
 >>> bt = btree()
 >>> bt.root = btnode()
 >>> bt.root.key = 5
 >>> bt.root.data = “data of key 5”
 >>> bt.root.left = btnode()
 >>> bt.root.left.key = 1
 >>> bt.root.left.data = “data of key 1”
 >>> bt.root.left.right = btnode()
 >>> bt.root.left.right.key = 2
 ・・・以下略
 >>> search(bt.root, 2)
2011/4/26 アルゴリズムとデータ構造 7 9
練習問題
 さきほどの2分探索木の search 手続き(関数)で
は,再帰呼び出しを用いていたが,かわりに while
を用いて,書き直してみよ
 ヒント:
def search_iter(node, key):
while ???:
if key < node.key:
node = ???
else:
node = ???
return node
ノードのキーが一致する
か,葉に到達するまで繰
り返す
キーを比較して,右を捜
すか左を探すかする
2011/4/26 アルゴリズムとデータ構造 7 10
解答例
2011/4/26 アルゴリズムとデータ構造 7 11
2分探索木の最大と最小
 2分探索木の左側の子を辿っていくと最小の要素が
見つかる
def bt_minimum(n):
while n.left != None:
n = n.left
return n
 最大の要素は右側の子を辿っていけば見つかる
def bt_maximum(n):
while n.right != None:
n = n.right
return n
2011/4/26 アルゴリズムとデータ構造 7 12
2分探索木への挿入
def insert(BT, key, data):
parent = None; p = BT.root
n = btnode()
# n.left = n.right = None
n.key = key; n.data = data
while p != None:
parent = p
if n.key < p.key: p = p.left
else: p = p.right
if parent == None:
BT.root = n # 空の木だった場合
elif n.key < parent.key:
parent.left = n
else:
parent.right = n
挿入する位置
を探す
2011/4/26 アルゴリズムとデータ構造 7 13
練習問題
 <1,2,3,4,5,6> の順にデータを挿入したときにできる木
の形は?
 実際に,以下のように insert して確認してみよ
>>> bt = btree()
>>> for k in [1,2,3,4,5,6]:
insert(bt, k, “data of key:” + str(k))
 2分探索木の search の最悪計算量はいくらか?
 最善の場合はいくらか?
【 Python 注】数値を
文字列に変換して連
結
2011/4/26 アルゴリズムとデータ構造 7 14
完全な2分木
2011/4/26 アルゴリズムとデータ構造 7 15
バランスが悪い2分木の例
2011/4/26 アルゴリズムとデータ構造 7 16
2分探索木からの削除
 削除したいノードを場合分け
 ノードが葉の場合
 単純に取り除いて, None に置き換える
 左右一方しか子供がいない場合
 そのノードの子と置き換える
 左右両方に子供がいる場合
 左側の部分木の最大の要素
(もしくは右側の部分木の最小
の要素)と置き換える
 
α
ノード間の大小関係
が保たれることに注
意
α
2011/4/26 アルゴリズムとデータ構造 7 17
2分探索木からの削除(2)
def delete(BT, key):
parent = None; p = BT.root
while p != None and key != p.key:
parent = p
if key < p.key: p = p.left:
else: p = p.right
if p == None: error(“key not found”) # 削除するキーが見つからない場合
if p.left == None:
r = p.right
else:
r, q = extract_max(p.left); r.left = q; r.right = p.right
if parent == None:
BT.root = r # 根を削除する場合
elif key < parent.key:
parent.left = r
else:
parent.right = r
削除するノー
ドを探す
p.left の最大要素と,そ
れを削除してできた新
しい部分木を返す(後
述)
2011/4/26 アルゴリズムとデータ構造 7 18
2分探索木からの削除(3)
 extract_max(n)
 部分木 n に含まれる最大要素のノード m と,そのノード m を削除した結果
の更新されたノード n を返す手続き
 n は None ではないものとする
def extract_max(n):
parent = None
p = n
while p.right != None:
parent = p
p = p.right
if parent == None:
return p, p.left
else:
parent.right = p.left
return p, n

Mais conteúdo relacionado

Mais de Kenta Hattori

オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6Kenta Hattori
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4Kenta Hattori
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13Kenta Hattori
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12Kenta Hattori
 
アルゴリズムとデータ構造11
アルゴリズムとデータ構造11アルゴリズムとデータ構造11
アルゴリズムとデータ構造11Kenta Hattori
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10Kenta Hattori
 

Mais de Kenta Hattori (20)

オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 
アルゴリズムとデータ構造13
アルゴリズムとデータ構造13アルゴリズムとデータ構造13
アルゴリズムとデータ構造13
 
アルゴリズムとデータ構造12
アルゴリズムとデータ構造12アルゴリズムとデータ構造12
アルゴリズムとデータ構造12
 
アルゴリズムとデータ構造11
アルゴリズムとデータ構造11アルゴリズムとデータ構造11
アルゴリズムとデータ構造11
 
アルゴリズムとデータ構造10
アルゴリズムとデータ構造10アルゴリズムとデータ構造10
アルゴリズムとデータ構造10
 

Último

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料Tokyo Institute of Technology
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ssusere0a682
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~Kochi Eng Camp
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラムKochi Eng Camp
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料Takayuki Itoh
 

Último (8)

TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
2024年度 東京工業大学 工学院 機械系 大学院 修士課程 入試 説明会 資料
 
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習106 -価格の交渉ゲーム-#ゲーム理論 #gametheory #数学
 
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
次世代機の製品コンセプトを描く ~未来の機械を創造してみよう~
 
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
世界を変えるクレーンを生み出そう! 高知エンジニアリングキャンプ2024プログラム
 
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
生成AIの回答内容の修正を課題としたレポートについて:お茶の水女子大学「授業・研究における生成系AIの活用事例」での講演資料
 

アルゴリズムとデータ構造7

  • 2. 2011/4/26 アルゴリズムとデータ構造 7 2 概要  2分探索木の性質について説明する  2分探索木による探索,挿入,削除のアルゴ リズムについて説明する.
  • 3. 2011/4/26 アルゴリズムとデータ構造 7 3 2分探索木  単純だが効率が良いのでよく使われる  2分探索木を作るには  2分木のノードに1つずつデータ(キー)を入れる  このとき,次のような関係を満たすようにする.  x を2分探索木のあるノードとする.  もし, y が x の左部分木の中にあるノードなら ば, y.key x.key≦  もし, y が x の右部分木の中にあるノードなら ば, x.key y.key≦  要するに,あるノードから見て左側の子孫のデータ すべてが,このノードのデータより小さく,逆に右 側の子孫のデータはすべて大きいような2分木のこ とである
  • 4. 2011/4/26 アルゴリズムとデータ構造 7 4 2分探索木の例  データが {1, 2, 8, 9, 10, 12, 15, 20, 25, 30} の場合の例:  練習問題  {1,2,3} の3つの値からなる2分探索木をすべて描け  (ヒント:全部で 5 種類あるはず) 20 2 1 9 15 25 30 8 12 10
  • 5. 2011/4/26 アルゴリズムとデータ構造 7 5 2分探索木の特徴  間順走査( in-order traversal )で木を辿りな がら,データを出力すると,出力されたデー タは順序どおりに並ぶ  各自,先ほど描いた図に対して,確認してみよ
  • 6. 2011/4/26 アルゴリズムとデータ構造 7 6 2分探索木の実現  2分探索木  木のルートを保持するフィールド root を1つだけ持つレ コード  def btree(): return record([‘root’])  2分探索木のノード  以下の 4 つのフィールドを持つレコード  left  左部分木のノード  right  右部分木のノード  key  レコードのキー  data  レコードのデータ  def btnode(): return record([‘left’, ‘right’, ‘key’, ‘data’]) 5 left right key data root bt: 1 8 2
  • 7. 2011/4/26 アルゴリズムとデータ構造 7 7 2分探索木の実現(2)  表の探索  見つかったら該当するノード,見つからなかったら None を返す def search(node, key): if node == None or key == node.key: return node if key < node.key: return search(node.left, key) else: return search(node.right, key)  search(BT.root, x) の形で呼び出す
  • 8. 2011/4/26 アルゴリズムとデータ構造 7 8 実験  p.6 に図示した2分探索木を作成して, search してみる  >>> bt = btree()  >>> bt.root = btnode()  >>> bt.root.key = 5  >>> bt.root.data = “data of key 5”  >>> bt.root.left = btnode()  >>> bt.root.left.key = 1  >>> bt.root.left.data = “data of key 1”  >>> bt.root.left.right = btnode()  >>> bt.root.left.right.key = 2  ・・・以下略  >>> search(bt.root, 2)
  • 9. 2011/4/26 アルゴリズムとデータ構造 7 9 練習問題  さきほどの2分探索木の search 手続き(関数)で は,再帰呼び出しを用いていたが,かわりに while を用いて,書き直してみよ  ヒント: def search_iter(node, key): while ???: if key < node.key: node = ??? else: node = ??? return node ノードのキーが一致する か,葉に到達するまで繰 り返す キーを比較して,右を捜 すか左を探すかする
  • 11. 2011/4/26 アルゴリズムとデータ構造 7 11 2分探索木の最大と最小  2分探索木の左側の子を辿っていくと最小の要素が 見つかる def bt_minimum(n): while n.left != None: n = n.left return n  最大の要素は右側の子を辿っていけば見つかる def bt_maximum(n): while n.right != None: n = n.right return n
  • 12. 2011/4/26 アルゴリズムとデータ構造 7 12 2分探索木への挿入 def insert(BT, key, data): parent = None; p = BT.root n = btnode() # n.left = n.right = None n.key = key; n.data = data while p != None: parent = p if n.key < p.key: p = p.left else: p = p.right if parent == None: BT.root = n # 空の木だった場合 elif n.key < parent.key: parent.left = n else: parent.right = n 挿入する位置 を探す
  • 13. 2011/4/26 アルゴリズムとデータ構造 7 13 練習問題  <1,2,3,4,5,6> の順にデータを挿入したときにできる木 の形は?  実際に,以下のように insert して確認してみよ >>> bt = btree() >>> for k in [1,2,3,4,5,6]: insert(bt, k, “data of key:” + str(k))  2分探索木の search の最悪計算量はいくらか?  最善の場合はいくらか? 【 Python 注】数値を 文字列に変換して連 結
  • 15. 2011/4/26 アルゴリズムとデータ構造 7 15 バランスが悪い2分木の例
  • 16. 2011/4/26 アルゴリズムとデータ構造 7 16 2分探索木からの削除  削除したいノードを場合分け  ノードが葉の場合  単純に取り除いて, None に置き換える  左右一方しか子供がいない場合  そのノードの子と置き換える  左右両方に子供がいる場合  左側の部分木の最大の要素 (もしくは右側の部分木の最小 の要素)と置き換える   α ノード間の大小関係 が保たれることに注 意 α
  • 17. 2011/4/26 アルゴリズムとデータ構造 7 17 2分探索木からの削除(2) def delete(BT, key): parent = None; p = BT.root while p != None and key != p.key: parent = p if key < p.key: p = p.left: else: p = p.right if p == None: error(“key not found”) # 削除するキーが見つからない場合 if p.left == None: r = p.right else: r, q = extract_max(p.left); r.left = q; r.right = p.right if parent == None: BT.root = r # 根を削除する場合 elif key < parent.key: parent.left = r else: parent.right = r 削除するノー ドを探す p.left の最大要素と,そ れを削除してできた新 しい部分木を返す(後 述)
  • 18. 2011/4/26 アルゴリズムとデータ構造 7 18 2分探索木からの削除(3)  extract_max(n)  部分木 n に含まれる最大要素のノード m と,そのノード m を削除した結果 の更新されたノード n を返す手続き  n は None ではないものとする def extract_max(n): parent = None p = n while p.right != None: parent = p p = p.right if parent == None: return p, p.left else: parent.right = p.left return p, n