ホーム » スタッフ » 斉藤徹 » 2分探索木の生成

2009年10月
« 9月   11月 »
 123
45678910
11121314151617
18192021222324
25262728293031

最近の投稿(電子情報)

アーカイブ

カテゴリー

2分探索木の生成

先週は2分木の操作のプログラミングであったが、今日は入力データを2分木に追加する処理を 説明する。追記すべき場所を末端まで移動しながら探し、追加する処理は、以下の通り。

int key ;
struct Tree* top = NULL ;
struct Tree** tail ;
for( tail = &top ; (*tail) != NULL ; /*none*/ ) {
if ( (*tail)->data == key )
break ;
else if ( (*tail->data > key )
tail = &( (*tail)->left ) ;
else
tail = &( (*tail)->right ) ;
}
if ( (*tail) == NULL )
(*tail) = tcons( key , NULL , NULL ) ;

この処理の動きを説明した後、データが昇順や降順に与えられると、枝が一方向にのみ 成長し、検索処理が O( N ) になってしまい、本来の O( log N ) にならないことを説明する。 このような場合、枝の途中で、繋ぎ換えを行えば枝の深さが減らせることを説明する。 これを全体に施し、最適化を行う方法として、AVL木を紹介する。

このような2分木の欠点としては、1データあたり2ポインタを必要とし、メモリの 利用効率としては悪いことを説明する。

この説明にあたり、32bit = int 、32bit = pointer で 説明をするが、最近のコンピュータであれば、Over 4GB になれば、32bit では不十分で あることを示し、64bit OS などが普及してきたことを関連情報として説明する。 2^64 = 16 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 = 16 EB( Exa Byte )

これらのメモリの使用効率を改善して、2分木と同様の左右の枝の概念を持つ方法として、 2分ヒープを紹介する。