二分探索木によるサーチ.

Slides:



Advertisements
Similar presentations
A Simple Constant Time Enumeration Algorithm for Free Trees 中野 眞一 宇野 毅明 群馬大学 情報学研究所 2003 年 9 月 19 日 アルゴリズム研究会.
Advertisements

データ構造とプログラミング技 法 (第3回) ー木構造ー. 木構造 (1) 根( root )と呼ばれる節 R が、 1 つだけ含まれ る。 R … TmTm T1T1 木構造: 1 個以上の節の有限集合 T であり、 次の二つの条件を満足するもの (2) 根以外の節は、 m (≧ 0 )個の互いに素な部.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
基本情報技術概論 I 演習(第5回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの演習 第13回.
アルゴリズムとデータ構造 第8回 ソート(3).
第10回 整列 ~ バブルソート,挿入ソート,選択ソート~
2分探索.
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
アルゴリズムとデータ構造 2010年7月5日
On the Enumeration of Colored Trees
Problem G : Entangled Tree
アルゴリズムとデータ構造 2012年6月14日
データ構造とアルゴリズム 第7回 木 ~ データ構造(3)~.
情報工学概論 (アルゴリズムとデータ構造)
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
データ構造とアルゴリズム 第6回の2 木 ~ データ構造(3)~.
ヒープソートの復習.
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 第7回探索のためのデータ構造(1) 2015/11/18 アルゴリズムとデータ構造 2015.
データ構造とアルゴリズム論 第9章 木構造 平成17年12月20日 森田 彦.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
2009/10/16 いろいろなデータ構造 第3講: 平成21年10月16日 (金) 4限 E252教室 コンピュータアルゴリズム.
Cプログラミング演習 中間まとめ2.
茨城大学 工学部 知能システム工学科 井上 康介 E2棟801号室
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
アルゴリズムとデータ構造1 2006年7月4日
離散数学 08. グラフの探索 五島.
アルゴリズムとデータ構造1 2006年6月16日
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 第6回 スレッド木
データ構造とアルゴリズム (第3回) ー木構造ー.
第9回 優先度つき待ち行列,ヒープ,二分探索木
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
離散数学 07. 木 五島.
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
Cプログラミング演習 第10回 二分探索木.
プログラミング基礎a 第8回 プログラムの設計 アルゴリズムとデータ構造
アルゴリズムとデータ構造 2010年7月26日
プログラミング 4 木構造とヒープ.
15.cons と種々のデータ構造.
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分の復習
情報数理Ⅱ 第11章 データ構造 平成29年1月18日.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造 2011年6月16日
アルゴリズムとデータ構造 2013年7月1日
基本情報技術概論(第6回) 埼玉大学 理工学研究科 堀山 貴史
ヒープソートの復習 第12回.
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 第2章 リスト構造 5月24日分
平面走査法を使った 一般線分の 交点列挙アルゴリズム
ヒープソート.
ヒープソート.
アルゴリズムとデータ構造 2013年6月20日
プログラミング演習I 2003年6月11日(第9回) 木村巌.
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
Presentation transcript:

二分探索木によるサーチ

アルゴリズムとデータ構造 複雑なプログラムを作成する時,データ構造とアルゴリズムについて考える必要がある アルゴリズム データ構造 問題を解くための論理または手順をアルゴリズムという ある1問題を解くためのアルゴリズムは,一般に複数個存在する. その中でもより効率よく解答を得られるようなアルゴリズムを見つけることが優れたプログラムを作成する上で大切 データ構造 アルゴリズムを容易にするために工夫されたデータの並び 基本的なデータ構造は,配列,構造体(レコード)型,キュー,スタック,リスト構造,木構造など

木構造 幾つかの節点(node)と,それらを結ぶ枝(branch)から構成 親 節点(node) 枝(branch) 子 節点がデータに対応 枝がデータ間の親子関係に対応 子: 節点の中で下方に分岐する枝の先にあるもの 親: 分岐元の節点 親 節点(node) 枝(branch) 子 図.単純な木構造

木構造 根(root) 葉(leaf) 部分木 根(root): 木の一番上の節点を根(root) 葉(leaf): 子を持たない節点 部分木: 木の中のある節点を相対的な根と考えたときの,そこから枝分かれした枝と節点の集合

二分木(binary tree) 木構造で,各節点から出る枝が二本以下のもの 木構造に関するアルゴリズムの中で,中心的なデータ構造

二分探索木(binary search tree) 二分木の一種 データの配置に規則あり 左側のすべての子は親より小さい 右側のすべての子は親より大きい データの探索のためのデータ構造 35 21 13 40 61 46 69

二分探索木による探索 根(root)から始める 探索キーの値と,各節点のデータを比較し,目標となるデータを探す 探索キーよりも節点のデータが小さいときは,右側の子をたどる 探索キーよりも節点のデータが大きいときは,左側の子をたどる

二分探索木による探索の例 (例) 40である節点を探す場合 根の値(35)と,探索キー(40)を比較 探索キーの方が大きいので,右側の子節点へ移る 次に移った節点の値(46)と探索キー(40)を比較し 探索キーの方が小さいので,左の子節点へ移る 次に移った節点(40)が,目標の節点である 35 21 13 40 61 46 69

再帰的なデータ構造 自分自身を定義するのに,自分自身より1次低い部分集合を用い,さらにその部分集合は,より低次の部分集合を用いて定義するという事を繰り返す構造

二分木の再帰的構造 二分木は,各節点の右部分木,左部分木も二分木 二分探索木では,探索において,子へ移動し,親での処理と同様の処理を繰り返す

二分探索木の走査 走査とは 二分木の節点を巡回する方法 一定の手順で木の全ての節点を訪れること pre-order traversal (行きがけ順) post-order traversal (帰りがけ順) in-order traversal (通りがけ順) 走査の方法や関数の作り方によって,処理速度が異なる

行きがけ順(pre-order traversal) 木の高さを計算する時のような,節上の走査がそれより下の部分木に依存する時に使われる 今の節点に操作を施す 左の節点へ移動 右の節点へ移動 A B C D E F G A, B, D, E, C, F, G の順に 節点を巡回

帰りがけ順(post-order traversal ) 左の節点へ移動 右の節点へ移動 今の節点に操作を施す A B C D E F G D, E, B, F, G, C, A の順に 節点を巡回

通りがけ順(in-order traversal ) 二分探索木で,全ての節点のデータを,ソートされた順番で表示するなど 左の節点へ移動 今の節点に操作を施す 右の節点へ移動 A B C D E F G D, B, E, A, F, C, G の順に 節点を巡回

2分木をC言語の構造体で表現 value // 2分木のノード struct BTNode { BTNode * left; BTNode * right; int value; }; left right value value left right left right

例題.二分探索木 二分探索木の探索プログラムを作る 二分探索木の節点を格納するために,構造体 NODE を作る 行きがけ順に,節点に0から6まで番号を付け,それぞれを node[0], ..., node[6]とする

#include<stdio.h> struct NODE{ int left; /*左の部分木*/ int value; /*節点の値*/ int right; /*右の部分木*/ } main() { struct NODE nod[] ={{1,35,3}, {2,21,EOF}, {EOF,13,EOF}, {4,46,5}, {EOF,40,EOF}, {EOF,61,6}, {EOF,69,EOF}}; int i, in; printf("Input Number :"); /*探す値を入力*/ scanf("%d", &in); i=0; while(nod[i].value!=in) { if ((nod[i].value>in) & (nod[i].left!=EOF)) { /*左の木を探す*/ i=nod[i].left; } else if ((nod[i].value<in) & (nod[i].right!=EOF)) { /*右の木を探す*/ i=nod[i].right; } else { printf(“Not Found\n”); /*一番下の節点にきても見つからない場合*/ exit(); printf("Found %d in nod[%d]\n", in, i); /*見つかった場合*/

末尾再帰最適化 末尾再帰を,非再帰的(反復的)なものに変換すること 末尾再帰 非再帰 kaijo(int a, int n) { if ( n > 1 ) { a = a * n; n--; return kaijo( a, n ); } return a; int main() printf( "%d\n", kaijo(1,5) ); return 0; kaijo(int n) { int f = 1; while(n>1) { f = f * n; n--; } return f; int main() printf( "%d\n", kaijo(5) ); return 0; 末尾再帰 非再帰

末尾再帰 とは? (ある条件の時に)関数の終わりで再帰呼び出しを実行するような関数 一般に、再帰関数による処理は、繰り返し処理で書き換え可能である(問題や記述言語によって、どちらの方が書きやすいか異なる) ただし、通常は、再帰呼び出しの方が時間的・メモリ的なコストがかかる しかし、末尾再帰の場合は、単純に再帰を繰り返しに置き換えられるので、計算機で最適化ができる(特にインタプリタ言語・実行環境で有効)