アルゴリズムとデータ構造勉強会 第6回 スレッド木

Slides:



Advertisements
Similar presentations
正規表現からのDFA直接構成.
Advertisements

第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
第11回 整列 ~ シェルソート,クイックソート ~
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
第11回 整列 ~ バケットソート,基数ソート,ヒープソート~
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
第10回 ソート(1):単純なソートアルゴリズム
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
情報工学概論 (アルゴリズムとデータ構造)
プログラミング論 II 電卓,逆ポーランド記法電卓
データ構造とアルゴリズム 第13回 スタックとキュー
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
第11回 整列 ~ シェルソート,クイックソート ~
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
マルチスレッド処理 マルチプロセス処理について
アルゴリズムとデータ構造1 2006年7月4日
プログラミング 4 記憶の割り付け.
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 B+tree.
二分探索木における要素削除 データ構造とプログラミング(10)
アルゴリズムとデータ構造 第3章 ヒープ 6月10日分
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2005年7月1日
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2005年7月5日
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
アルゴリズムとデータ構造 2011年7月8日課題の復習
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
15.cons と種々のデータ構造.
データ構造とアルゴリズム 第11回 リスト構造(1)
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造 2013年7月1日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 補足資料11-3 「線形リストのオペレータ」
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
ヒープソート.
参考:大きい要素の処理.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Presentation transcript:

アルゴリズムとデータ構造勉強会 第6回 スレッド木 アルゴリズムとデータ構造勉強会 第6回 スレッド木

スレッド木とは スレッドを追加することによって、木の   節点を異なった順番で容易にたどれる   木である。

スレッド木の基本的性質 1.スレッドを作成するには、通りがけ順で1つ前に位置する先行節点(predecessor)と、1つ後ろに位置する後続節点(successor)のポインタを、未使用の子ポインタに格納 する。 2.スレッドは対称で、左の子スレッドは先行節点を指し、   右の子スレッドは後続節点を指しており、この種の木は   対称なスレッド木と呼ばれる。

3.各節点には2つの子ポインタがあるので、木の中にN個の節点がある場合は、2N個のリンクとスレッドが存在   しなければならない。これらのトラバースアルゴリズムは   各リンクとスレッドに1回ずつ立ち寄るので、その計算量   はO(2N)=O(N) 4.木の最初の節点と最後の節点の添字を常に追跡する   ようにすれば、アルゴリズムの実行時間はすこし速く   なる。

C A E G B D F H 図1 スレッドを点線で示した対称なスレッド木

先行節点を見つけるプログラム PThreadedNode *Predecessor(PThreadedNode *node) { PThreadedNode *child if (node->LeftChild == NULL){ return NULL; }else if(node->HasLeftChild == TRUE){ child = node->LeftChild; while (child->HasLeftChild) { child = child->RightChild; }return child; }else{return node -> LeftChild;}; };

木の最初と最後の節点を見つける関数 PthreadedNode *FirstNode(); { Result = Root; while ((Result->LeftChild)!=NULL) {Result = Result->LeftChild;} }; PThreadedNode *LastName(); while ((Result->RightChild)!=NULL) {Result = Result->RightChild;}

節点を昇順と降順に表示する手続き Void ReverseInorder(); Void Inorder(); { { struct PThreadedNode node; node = LastNode; while (node != NULL) VisitNode (node->Value); node = Predecessor(node); } }; Void Inorder(); { struct PThreadedNode node; node = FirstNode; while (node != NULL) VisitNode (node->Value); node = Sucessor(node); } };

スレッド木の管理 スレッド木を管理するには、木のスレッドを   適切に保ちつつ、木に節点を追加したり、   木から節点を削除できなければならない。

C A E G B D F H X 図2 節点Xを追加されたスレッド木

左の子として挿入する手続き Void AddLeftChild (PThreadedNode *parent, PThreadedNode *Child); { child->LeftChild = parent ->LeftChild; child->HasLeftChild = FALSE; parent->LeftChild = child; parent->HasLeftChild = TRUE; child->RightChild = parent; child->HasRightChild = FALSE; if ((child->LeftChild) == NULL) {FirstNode = child;} };

左の子に新しい節点を追加する手続き 木の最初の節点と最後の節点の添字を追跡している場合は、この場所をチェックして、新しく追加された節点が木の最初の節点になっていないかどうか調べる必要がある。新しい節点の先行節点のスレッドがNULL値を持つ場合、そこが新たに最初の節点になる。 * 右の子として挿入する場合も同様である。

スレッド木から節点を削除 スレッド木から節点を削除するには、その前に、 その子孫を削除する必要がある。節点に子が   その子孫を削除する必要がある。節点に子が   なくなれば、その節点は簡単に削除できる。

C A E G B D H X   図3 節点Fを削除したスレッド木

左の子を削除する手続き void RemoveLeftChild (PThreadedNode *parent); { struct PThreadedNode target; target = parent->LeftChild; parent->LeftChild = target->LeftChild; };

実習 図1に示すスレッド木をC/C++プログラムで作って、そのあと、そのスレッド木を図3に示すスレッド木にかえてください。