ホーム » スタッフ » 斉藤徹 » 2分木と式の表現・B木

2011年11月
« 10月   12月 »
 12345
6789101112
13141516171819
20212223242526
27282930  

最近の投稿(電子情報)

アーカイブ

カテゴリー

2分木と式の表現・B木

2分木の応用として、式の表現の説明を行う。

まず、式の表現にあたって、演算子の優先順位の話として、 "1+2+3"が、"((1+2)+3)"として扱われる左結合で、 "x=y=z=0"は、"x=(y=(z=0))"で扱われる右結合といった話を説明する。 これらの優先順位情報は、分かり難いのでプログラムと処理しやすいように扱う必要がある。 "2+3*4"といった式は、前置記法では"+,2,*,3,4"と表現される。 一方、後置記法(逆ポーランド記法)では、"2,3,4,*,+"となる。 特に逆ポーランド記法は、計算の機械語生成に結びつくので、よく利用される。

でも、2項演算子は2分木として表現できるため、以下のようなプログラムで 式を扱うこともできる。

struct Exp {
int type ;
int data ;
struct Exp* left ;
struct Exp* right ;
} ;
struct Exp* Integer( int x ) {
struct Exp* n ;
n = (struct Exp*)malloc( sizeof( struct Exp ) ) ;
if ( n != NULL ) {
n->type = 0 ;
n->data = x ;
n->left = n->right = NULL ;
}
return n ;
}
struct Exp* Operator( int op , struct Exp*l , struct Exp*r ) {
struct Exp* n ;
n = (struct Exp*)malloc( sizeof( struct Exp ) ) ;
if ( n != NULL ) {
n->type = 1 ;
n->data = op ;
n->left = l ;
n->right = r ;
}
return n ;
}
int eval( struct Exp* x ) {
if ( x->type == 0 ) {
return x->data ;
} else {
int l = eval( x->left ) ;
int r = eval( x->right ) ;
switch( x->data ) {
case '+' : return l + r ;
case '*' : return l * r ;
}
}
}
void main() {
struct Exp* x =
Operator( '+' , Integer( 2 ) ,
Operator( '*' , Integer( 3 ) ,
Integer( 4 ) ) ) ;
printf( "%d" , eval( x ) ) ;
}

次に、演算子といっても単項演算子、2項演算子、3項演算子などがあり、 これらのデータを表現することを考えると、2分木は3分木といった拡張の イメージもでてくるであろう。これをもっと一般的にすれば、n分木も 考えられる。これをデータベース用にしたものはB木となる。 この方式は、n件のデータと(n+1)件のポインタで実装される。 詳しくは、B木にて。

この話のおまけとして、データベースシステムについて簡単に話す。 特に、データベースが使われるような巨大なシステムになると、 3段スキーマ構成といった事例や、SQLによるアクセスといった、 一般的な話の導入について紹介する。