アルゴリズムとデータ構造 5月14日分

アルゴリズムとデータ構造
第2章 リスト構造
5月24日分
情報知能学科
白井英俊
リストの応用(1) 二重線形リスト構造
• 線形リスト構造:ポインタが一つ
次のようなセルをつなぐことで実現
data
next
データ部
ポインタ
• 二重線形リスト構造:ポインタは二つ
prec
data
next
ポインタ
データ部
ポインタ
二重線形リスト構造(続)
線形リスト構造
後続のセルだけ、たどることが可能
二重線形リスト構造
後続のセルだけではなく、その前のセルもたどることが可能
リストの応用(2) 木構造
根つき木、もしくは木構造
(1) 頂点と辺とから作られる
頂点: vertex, node, ノード、節点、…
辺: edge, arc, アーク、枝、…
木はグラフの一種。
頂点は 、辺は
や
で表す
(2) 根(root) という特別な頂点がただ一つある
木構造(続)
• パス(道):頂点と頂点を結ぶ辺の集合
• 根は特別な頂点
根から、他のどの頂点へも辺をたどっていくことができる
• 木とグラフの違い
頂点から別な頂点へのサイクルがない(同じ頂点同士
を結ぶ複数のパスが存在しない)
グラフ理論の用語
木とグラフの違い
木: v0 が根。根からはど
の頂点へも枝をたどってい
ける。同じ頂点への複数の
パスはない。
グラフ: 『根』のような特殊な
頂点はない。v0 からv4へは、
v1を通っても、v2を通ってもい
ける(複数のパスがある)。
v0
v1
v3
v2
v4
v5
v7
v1
v6
v8
v0
v2
v3
v4
v5
v6
木の用語
v0
• 親と子 (例: v1とv4)
v1
2つの頂点が結ばれていると
v2
き、上の頂点を親(parent)、
下の頂点を子(son)、という v4
v5
• 兄弟(例:v4とv5)
同じ親を持つ子頂点同士を
兄 弟(brother)、という
v7
v3
v6
v8
•最も左の子を、第一子(first child)という ( 例: v1の第一子は
v4、v5の第一子はv7 )
•右隣の兄弟を、次の兄弟(next brother)、という( 例: v1の次
の兄弟はv2、v2の次の兄弟はv3 )
•葉(leaf): 子を持たない頂点(例: v2, v3, v4, v7, …)
木の用語の確認
• 試験の頻出問題
v0
右の木の(1)根, (2)v5の兄弟の頂点
すべて、(3)v6の先祖の頂点すべて、 v1
v2
(4)v2の子孫の頂点すべて、(5)葉の
v4
頂点すべて、を答えよ
v5
v6
定義:頂点xの「先祖」とは、xの親頂
点すべて、およびxの親頂点の先
v9
祖すべて(再帰的な定義)
定義:頂点xの「子孫」とは、xの子頂
点すべて、およびxの子頂点の子
孫すべて(再帰的な定義)
v3
v7 v8
v10
木の表現
• 線形リスト構造を、セル(の集まり)で表したよ
うに、木構造を次のようなデータ構造(ノード
と呼ぶ)で表す
class Node
def initialize(u,v,w,x)
@label = u
@parent = v
@firstChild = w
@nextBrother = x
end
end
@parent
self
@firstChild
木の表現(続)
クラスNodeを図示すると、次のようになる
頂点 一個一個が以下の構造をもつ
@parent
親頂点
label (ラベル)
parent (親)
self
@nextBrother
firstChild(第一子)
nextBrother(次の兄弟)
@firstChild
子頂点
兄弟頂点
練習:木の表現
右の木をNodeクラスを用いて表す
それには、7つのNodeインスタ
ンスが必要…一つの頂点が一
つのNodeインスタンスに対応
v1
v4
根の頂点 v0 の表現
ラベル
v0
親頂点
nil
頂点 v1
第一子
次の兄弟
nil
v0
v2
v5
v3
v6
練習:木の表現(続)
根の頂点 v0 の表現
ラベル
v0
親頂点
nil
v1
第一子
次の兄弟
nil
v4
頂点 v1
ラベル
v0
v1
親頂点
第一子
次の兄弟
頂点 v2
頂点 v4
v2
v5
v3
v6
練習:木の表現(続)
ラベル
v0
nil
親頂点
第一子
nil
次の兄弟
ラベル
v1
v0
v1
v4
ラベル
親頂点
親頂点
第一子
第一子
次の兄弟
次の兄弟
ラベル
v4
親頂点
親頂点
第一子
次の兄弟
ラベル
nil
第一子
次の兄弟
v2
v3
v6
v5
v2
v5
練習:木の表現を完成させよう
ラベル
v0
v0
nil
親頂点
v1
第一子
nil
次の兄弟
ラベル
v1
親頂点
第一子
次の兄弟
ラベル
v4
親頂点
第一子
次の兄弟
nil
v4
v2
v5
ラベル
親頂点
第一子
次の兄弟
v2
ラベル
親頂点
第一子
次の兄弟
v5
nil
nil
v3
v6
ラベル
親頂点
第一子
次の兄弟
ラベル
親頂点
第一子
次の兄弟
v3
v6