情報工学概論 (アルゴリズムとデータ構造)

Slides:



Advertisements
Similar presentations
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
Advertisements

基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
離散システム特論 整列(sorting)アルゴリズム 2.
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
2分探索.
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
第8講: 平成19年11月9日 (金) 4限 E252教室 探索アルゴリズム(1).
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
情報工学概論 (アルゴリズムとデータ構造)
岩井 儀雄 コンピュータ基礎演習  ー探索、整列ー 岩井 儀雄
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
ベイジアンネットワーク概説 3.6 構造の探索アルゴリズム
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
第11回 整列 ~ シェルソート,クイックソート ~
二分探索木によるサーチ.
7-3.高度な木 (平衡木) AVL木 平衡2分木。回転操作に基づくバランス回復機構により平衡を保つ。 B木
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
算法数理工学 第3回 定兼 邦彦.
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
“Purely Functional Data Structures” セミナー
アルゴリズムとデータ構造1 2006年7月4日
情報工学概論 (アルゴリズムとデータ構造)
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 第6回 スレッド木
二分探索木における要素削除 データ構造とプログラミング(10)
データ構造とアルゴリズム (第3回) ー木構造ー.
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
離散数学 07. 木 五島.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
復習+α JBuilderの使い方を思い出す。 配列とGUI 再帰とマージソート 木と二分木の探索
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月16日
算法数理工学 第4回 定兼 邦彦.
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Advanced Data Structure 第3回
アルゴリズムとデータ構造1 2009年7月2日
平面走査法を使った 一般線分の 交点列挙アルゴリズム
ヒープソート.
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

情報工学概論 (アルゴリズムとデータ構造) 第9回

12. 2分探索木 探索木: SEARCH, MINIMUM, MAXIMUM, PREDECESSOR, SUCCESSOR, INSERT, DELETE等が利用できる動的集合用データ構造 辞書やプライオリティーキューとして利用できる 基本操作は木の高さに比例した時間がかかる ランダムに構成された2分探索木の高さ: O(lg n) 最悪時: O(n) 最悪時でも O(lg n) に改良できる (2色木)

12.1 2分探索木とは何か? 各節点は key, left, right, p フィールドを持つ 2分探索木条件 (binary-search-tree property) 節点 y が x の左部分木に属する⇒ key[y]key[x] 節点 y が x の右部分木に属する⇒ key[x]key[y] 5 2 3 7 8 5 2 3 7 8

木の中間順巡回 木の中間順巡回 (通りがけ順, inorder tree walk 根の左部分木に出現するキー集合 根のキー 右部分木に出現するキー集合の順にキーを出力 木の根から辿ると,全てのキーをソートされた順序で出力できる (n) 時間 5 2 3 7 8 INORDER_TREE_WALK(node x) { if (x != NIL) { INORDER_TREE_WALK(left(x)); print(key(x)); INORDER_TREE_WALK(right(x)); } 5 7 3 2 8 5

その他の巡回法 先行順巡回 (行きがけ順, preorder tree walk): 根節点を先に出力し,次に左右の部分木を出力 後行順巡回 (帰りがけ順, postorder tree walk): 先に左右の部分木を出力し,最後に根節点を出力 PREORDER_TREE_WALK(node x) { if (x != NIL) { print(key(x)); PREORDER_TREE_WALK(left(x)); PREORDER_TREE_WALK(right(x)); } POSTORDER_TREE_WALK(node x) { if (x != NIL) { POSTORDER_TREE_WALK(left(x)); POSTORDER_TREE_WALK(right(x)); print(key(x)); }

12.2 2分探索木に対する質問操作 質問操作は高さに比例した時間で終了する 探索: 2分探索木の中から,ある与えられたキーを持つ節点のポインタを求める(存在しなければNIL) TREE_SEARCH(node x, data k) { if (x == NIL || k == key(x)) return x; if (k < key(x)) return TREE_SEARCH(left(x),k); else return TREE_SEARCH(right(x),k); }

探索の正当性 キー k が見つかったら探索を終了する k が key(x) より小さい場合 k が key(x) より大きい場合 2分探索木条件より,k は x の右部分木にはない 左部分木に対して探索を続行する k が key(x) より大きい場合 右部分木に対して探索を続行する 探索する節点は根からのパスになる 実行時間は O(h) (h: 木の高さ)

再帰はwhileループにすることができる ITERATIVE_TREE_SEARCH(node x, data k) { while (x != NIL && k != key(x)) { if (k < key(x)) x = left(x); else x = right(x); } return x;

最小値と最大値 最小/最大のキーを持つ要素のポインタを返す O(h) 時間 TREE_MINIMUM(node x) { while (left(x) != NIL) { x = left(x); } return x; TREE_MAXIMUM(node x) { while (right(x) != NIL) { x = right(x); } return x;

次節点と前節点 2分探索木のある節点が与えられたとき,木の中間順 (inorder) で次/前の節点を求める O(h) 時間 TREE_SUCCESSOR(node x) { node y; if (right(x) != NIL) return TREE_MINIMUM(right(x)); y = p(x); while (y != NIL && x == right(y)) { x = y; y = p(y); } return y;

x が右部分木を持つ場合 x の次節点は,x 以上の要素で最小 ⇒ x の次節点は, x の右部分木の最小要素 = TREE_MINIMUM(right(x)) 5 2 7 8 x 次節点

x が右部分木を持たない場合 x の親を y とする x が,x の親の右の子ならば,親は x 以下 次節点 x y y = p(x); while (y != NIL && x == right(y)) { x = y; y = p(y); } return y; 9 x y 5 x y 3 7 2 5 8

定理 12.2 高さ h の2分探索木上の動的集合演算 SEARCH, MAXIMUM, MINIMUM, SUCCESSOR, PREDECESSOR は O(h) 時間で実行できる

12.3 挿入と削除 要素を挿入/削除したあとも2分探索木条件が満たされる必要がある 挿入は比較的簡単 削除は複雑 どちらも O(h) 時間

挿入 5 6 z 3 6 z y x y 7 TREE_INSERT(tree T, node z) { node x,y; y = NIL; x = root(T); while (x != NIL) { // z を挿入する場所 x を決める y = x; if (key(z) < key(x)) x = left(x); else x = right(x); } // y は x の親 p(z) = y; // z の親を y にする if (y == NIL) root(T) = z; // T が空なら z が根節点 else if (key(z) < key(y)) left(y) = z; // y の子を z にする else right(y) = z; } 2 5 8 挿入場所は必ず葉

削除 探索木から節点 z を削除する z が子を持たない場合 z が子を1つ持つ場合 z の親 p(z) を変更する 2 5 3 z 5 7 8 z

削除: z が子を2つ持つ場合 z の次節点は左の子を持たない z の場所に y を入れ,元の y を削除する 5 10 3 12 13 15 z 6 7 y 6 10 3 12 13 15 7

TREE_DELETE(tree T, node z) { node x, y; if (left(z) == NIL || right(z) == NIL) y = z; // z の子の数が1以下 else y = TREE_SUCCESSOR(z); // z は2つの子を持つ if (left(y) != NIL) x = left(y); else x = right(y); // x は y の子 if (x != NIL) p(x) = p(y); // y を削除する if (p(y) == NIL) root(T) = x; // y が根なら x を根に else if (y == left(p(y))) left(p(y)) = x; // y の親と子をつなぐ else right(p(y)) = x; if (y != z) { key(z) = key(y); // y の内容を z に移動 // y の付属データを z にコピー } return y; // 不必要な y を回収

12.4 ランダムに構成された2分探索木 2分探索木上の基本操作は O(h) 時間で実行可 n 個の相異なるキーをランダムな順序で挿入した2分探索木の高さを解析する 高さの期待値は O(lg n)

仮定 確率変数の定義 入力キーの n! 種類の順列がどれも等確率で出現する 全てのキーは異なる Xn: n 個のキー上のランダムに構成された2分探索木の高さ Yn = 2Xn 指数高さ Rn: n 個のキーの中での根のキーの順位 (rank) Rn = i なら,根の左部分木は i1 個のキー上の ランダムに構成された2分探索木,右部分木は ni 個のキー上のランダムに構成された2分探索木

2分探索木の高さは根の左右の部分木の高さの 大きいほう+1. Rn = i のとき Y1 = 1. 便宜上 Y0 = 0 と定義する. 指標確率変数 を次のように定義 Rn の値は {1,2,…,n} の任意の要素を等確率で 取るから,Pr{Rn = i} = 1/n (i=1,2,…,n) よって

根の順位が i のときだけ Zn,i = 1 になるから E[Yn] が多項式であることが示せれば, E[Xn] が O(lg n) であることが示せる. Zn,i は Yi1 とも Yni とも独立 根の左部分木内の各要素は根よりも小さい,つまり 順位が i より小さい i1 個のキー上のランダムに構成 された木である. この部分木は順位の制約がないi1 個のキー上のランダムな木と同じ 部分木の高さ Yi1 と根の順位 Zn,i は独立

を示す

関数 f(x) = 2x は下に凸であるから 以上より 定理12.4 n 個のキー上のランダムに構成された2分探索木の高さの期待値は O(lg n).