ã“ã®ãƒ‰ã‚ュメント㯠http://edu.net.c.dendai.ac.jp/ 上ã§å…¬é–‹ã•ã‚Œã¦ã„ã¾ã™ã€‚
é †åºæœ¨ã¯ã€å€¤ã®å¤§å°ã«åŸºã¥ã„ã¦å€¤ã‚’æ ¼ç´ã™ã‚‹æœ¨ã§ã‚ã‚Šã€ä½Žã„コストã§å€¤ã‚’å°ã• ã„é †ã«å–り出ã™ã“ã¨ãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ é †åºæœ¨ã¨ã¯ã€å„é ‚ç‚¹ã«å€¤ã‚’æŒã¤äºŒåˆ†æœ¨ã®ã†ã¡ã€æ¬¡ã®æ€§è³ªã‚’æŒã¤ã‚‚ã®ã§ã™ã€‚
ã“ã®ã‚ˆã†ãªæ€§è³ªã‚’æŒã£ã¦ã„る木ã«å¯¾ã—ã¦æ–°ãŸãªå€¤ã‚’æ ¼ç´ã™ã‚‹ã“ã¨ã‚’考ãˆã¾ã™ã€‚ å€¤ã‚’æ ¼ç´ã§ãã‚‹å ´æ‰€ã‚’æŽ¢ã™éš›ã€å„é ‚ç‚¹ã®æŒã¤å€¤ã¨æ¯”較ã—ã¦ã„ãã“ã¨ã§ã€é ‚点㮠å³ã®æžã®æ–¹é¢ã‹å·¦ã®æžã®æ–¹é¢ã‹é¸ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚ ã™ã‚‹ã¨ã€æœ¨ã®æ·±ã•åˆ†ã ã‘値を比較ã™ã‚‹ã“ã¨ã§æŒ¿å…¥å¯èƒ½ãªå ´æ‰€ã‚’æœã—出ã›ã‚‹ã“㨠ã«ãªã‚Šã¾ã™ã€‚ 木ã®æ·±ã•ã¯ã€éƒ½åˆãŒè‰¯ã„å ´åˆã§å…¨é ‚点数 N ã«å¯¾ã—㦠log N 程度ã«ãªã‚Šã¾ã™ã®ã§ã€æŒ¿å…¥ã®æ‰‹é–“ã‚‚ãã®ç¨‹åº¦ã§åŽã¾ã‚Šã¾ã™ã€‚ ã¾ãŸã€æœ€å°ã€æœ€å¤§ã®å€¤ã‚‚ãã‚Œãžã‚Œæœ¨ã®ä¸€ç•ªå·¦ã¨å³ã®è¦ç´ ã«ãªã‚Šã¾ã™ã‹ã‚‰ã€ã‚„㯠り木ã®æ·±ã•ç¨‹åº¦ã®æ‰‹é–“ã§è¦‹ã¤ã‘られã¾ã™ã€‚
値 1, 2, 3, 4 ã‚’æŒã¤é †åºæœ¨ã‚’å…¨ã¦æ›¸ãã ã—ãªã•ã„。
å…¨ã¦ã®äºŒåˆ†æœ¨ã®å½¢ã«å¯¾ã—ã¦ã€ãã‚Œãžã‚Œã«æ ¼ç´ã®æ–¹æ³•ãŒä¸€é€šã‚Šã ã‘å¯èƒ½ã§ã™ã€‚
C 言語ã§ã¯é †åºæœ¨ã‚’作るã®ã«ã€æ§‹é€ 体ã¨ãƒã‚¤ãƒ³ã‚¿ã‚’使ã„ã¾ã™ã€‚æ§‹é€ ä½“ã®ä¸ã«ã‚ー ã¨ã€å€¤ã¨ã€å·¦å³ã®åã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’æ ¼ç´ã—ã¾ã™ã€‚ ãã—ã¦ã€å€¤ã‚’付ã‘åŠ ãˆã‚‹é–¢æ•° add(TREE **t, ã‚ー, 値)ã¯ã€æ¬¡ã®ã‚ˆã†ã«å†å¸°çš„㫠処ç†ã—ã¾ã™ã€‚
ãªãŠã€é ‚点を付ã‘åŠ ãˆã‚‹å‡¦ç†ã§ NULL ã ã£ãŸãƒã‚¤ãƒ³ã‚¿ã®å€¤ã‚’書ãæ›ãˆãŸã„ã®ã§ã€ ãƒã‚¤ãƒ³ã‚¿ã®æ ¼ç´ã•ã‚Œã¦ã„る番地を引数ã«æ¸¡ã—ã¦ãƒã‚¤ãƒ³ã‚¿ã®å†…容を書ãæ›ãˆã¦ã¾ ã™ã€‚
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tr {
int key;
char *id;
struct tr *left,*right;
} TREE;
void add(TREE **t, int p, char *i){
if(*t==NULL){
*t=(TREE *)malloc(sizeof(TREE));
if(*t==NULL){
fprintf(stderr,"メモリーエラー\n");
exit(1);
}
(*t)->key=p;
(*t)->id=strdup(i);
if((*t)->id ==NULL){
fprintf(stderr,"メモリーエラー\n");
exit(1);
}
(*t)->left=NULL;
(*t)->right=NULL;
}else{
if((*t)->key>p){
add(&((*t)->left),p,i);
}else{
add(&((*t)->right),p,i);
}
}
}
void show(TREE *t){
if(t!=NULL){
show(t->left);
printf("%s: %d\n",t->id,t->key);
show(t->right);
}
}
void deltree(TREE *t){
if(t!=NULL){
deltree(t->left);
deltree(t->right);
free(t->id);
free(t);
}
}
int main(void){
TREE *t=NULL;
add(&t,100,"02kc963");
add(&t,62,"02kc903");
add(&t,85,"02kc923");
add(&t,73,"02kc911");
add(&t,85,"02kc987");
show(t);
deltree(t);
return 0;
}
strdup ã¯æ–‡å—é…列を別ã®é ˜åŸŸã‚’確ä¿ã—ã¦ã‚³ãƒ”ーã™ã‚‹ã‚‚ã®ã§ã™ã€‚メモリーãŒç¢ºä¿ ã§ããªã‹ã£ãŸæ™‚㯠NULL ã‚’è¿”ã—ã¾ã™ã€‚
deltree ã¯ä½œæˆã—ãŸæœ¨ã‚’消ã™é–¢æ•°ã§ã™ã€‚プãƒã‚°ãƒ©ãƒ ãŒçµ‚了ã™ã‚‹ã¨ä½¿ç”¨ã—ãŸé ˜åŸŸ ã¯ã™ã¹ã¦ OS ãŒè‡ªå‹•çš„ã«å›žåŽã—ã¾ã™ãŒã€ãƒ—ãƒã‚°ãƒ©ãƒŸãƒ³ã‚°ã®ãƒ†ã‚¯ãƒ‹ãƒƒã‚¯ã¨ã—ã¦ä½œ æˆã—ãŸã‚‚ã®ã‚’消ã™æ–¹æ³•ã¯å¦ã‚“ã§ãŠãã¹ãã§ã™ã®ã§ã€å¯èƒ½ãªé™ã‚Š malloc, strdup ãªã©ã§ç¢ºä¿ã—ãŸãƒ¡ãƒ¢ãƒªãƒ¼ã¯ãã®éƒ½åº¦æ¶ˆã™ã‚ˆã†ã«ã—ã¦ä¸‹ã•ã„。
ãªãŠã€ã“ã®ã¾ã¾ã§ã¯æœ¨ã®æ§‹é€ ãŒã‚ã‹ã‚Šã¥ã‚‰ã„ã®ã§ã€æœ¨ã®ã©ã®é ‚点ã«ã‚ã‚‹ã‹ã‚’表 示ã™ã‚‹é–¢æ•° showstructure()を作りã¾ã—ãŸã€‚ 呼ã³å‡ºã™æ™‚ã¯ã€æœ¨ã®æ ¹ã®é ‚点ã¸ã®ãƒã‚¤ãƒ³ã‚¿ã‚’ t ã¨ã—㦠showstructure(t,""); ã¨ã—ã¦å‘¼ã³å‡ºã—ã¾ã™ã€‚
void showstructure(TREE *t,char *depth){
char *p,*q;
if(t!=NULL){
if((p=(char *)malloc((strlen(depth)+2)*sizeof(char)))==NULL){
fprintf(stderr,"メモリーエラー\n");
exit(1);
}
printf("%s: %d\n",depth,t->key);
strcpy(p,depth);
for(q=p;*q!='\0';q++);
*(q+1)='\0';
*q='l';
showstructure(t->left,p);
*q='r';
showstructure(t->right,p);
free(p);
}
}
上ã®ãƒ—ãƒã‚°ãƒ©ãƒ を点数ã®å¤§ãã„é †ã«å‡ºåŠ›ã™ã‚‹ã‚ˆã†ã«æ”¹é€ ã—ãªã•ã„。
特定ã®å€¤ã¨ä¸€è‡´ã™ã‚‹ã‚ーをæŒã¤é ‚点ã®ãƒã‚¤ãƒ³ã‚¿ã‚’è¿”ã™é–¢æ•° find を作りãªã•ã„。
æœ¨æ§‹é€ ã‚’åˆ©ç”¨ã—ã¦ã€æ–‡å—列ãŒã‚ーã¨ãªã‚‹é…列を作りã¾ã™ã€‚ set(ãƒã‚¤ãƒ³ã‚¿ã®ç•ªåœ°, ã‚ー, 値) 㨠get(ãƒã‚¤ãƒ³ã‚¿, ã‚ー) ã§å€¤ã®æ ¼ç´ã€å–ã‚Š 出ã—ã‚’è¡Œã„ã¾ã™ã€‚
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tr {
char *key;
int num;
struct tr *left,*right;
} TREE;
int get(TREE *t, char *k){
int res;
if(t==NULL){
return 0;
}else{
res=strcmp(t->key,k);
if(res==0){
return t->num;
}else if(res>0){
return get(t->left,k);
}else{
return get(t->right,k);
}
}
}
void set(TREE **t, char *k, int i){
int res;
TREE *newnode;
if(*t==NULL){
*t=(TREE *)malloc(sizeof(TREE));
(*t)->key=k;
(*t)->num=i;
(*t)->left=NULL;
(*t)->right=NULL;
}else{
res=strcmp((*t)->key,k);
if(res==0){
(*t)->num=i;
}else if(res>0){
return set(&((*t)->left),k,i);
}else{
return set(&((*t)->right),k,i);
}
}
}
void show(TREE *t){
if(t!=NULL){
show(t->left);
printf("%s: %d\n",t->key,t->num);
show(t->right);
}
}
int main(void){
TREE *t=NULL;
set(&t,"abc",50);
set(&t,"def",20);
printf("%d\n",get(t,"abc"));
printf("%d\n",get(t,"def"));
return 0;
}
æ–‡å—列ã®é »åº¦ã‚’表示ã™ã‚‹ãƒ—ãƒã‚°ãƒ©ãƒ を書ããªã•ã„。 æ–‡å—列ã¯é…列ã«å…¥ã£ã¦ã„ã‚‹ã¨ã—ã€è¡¨ç¤ºã¯ã€Œæ–‡å—列:é »åº¦ã€ã®å½¢å¼ã§å‡ºã—ãªã•ã„。
char *data[]={"abc","def","efg","abc","abc","efg",NULL};
abc: 3 def: 1 efg: 2
C++ ã§ã¯å¤–見上ã€æœ¨æ§‹é€ ã‚’æä¾›ã—ã¦ã„ã¾ã›ã‚“ãŒã€ map 㨠multimap ã¯å†…部的
ã«é †åºæœ¨ã‚’使ã£ã¦ã¾ã™ã€‚
æ ¼ç´ã§ãる値ã¯ã‚ーã¨å€¤ã®äºŒç¨®é¡žã§ã™ã€‚map ã¯é‡è¤‡ã™ã‚‹ã‚ーを許ã•ãšã€
multimap ã¯é‡è¤‡ã‚ーを許ã—ã¾ã™ã€‚
map ã‚„ multimap を使ã†ã«ã¯å¼•æ•°ã«ã€ã‚ーã®åž‹ã€å€¤ã®åž‹ã€ã‚ーã®æ¯”較をã™ã‚‹ã‚¯
ラス less テンプレートを指定ã—ã¾ã™ã€‚
値を挿入ã™ã‚‹ insert メソッドを使ã†ã«ã¯æŒ¿å…¥ã™ã‚‹ãŸã‚ã®ç‰¹åˆ¥ãªåž‹ã®ã‚ªãƒ–ジェ
クトを作らãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。ãã®ãŸã‚ã€map ã‚„ multimap ã§ä½œã£ãŸåž‹ x
ã«å¯¾ã—ã¦ã€x::value_type ã¨ã„ã†åˆ¥ã®ã‚¯ãƒ©ã‚¹ã‚’用æ„ã—ã€ã“ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’使ã£
ã¦æŒ¿å…¥ã—ã¾ã™ã€‚
iterator 㯠begin(), end(), lower_bound(), upper_bound() ãªã©ã®ãƒ¡ã‚½ãƒƒ
ドã§å¾—られã¾ã™ã€‚
ãªãŠã€ map ã§ã¯ã•ã‚‰ã« オブジェクト[ã‚ー]
ã¨ã„ã†æ§‹æ–‡ã§æ¤œç´¢ã€
æ›´æ–°ãŒå¯èƒ½ã§ã™ã€‚以下ã«ã‚µãƒ³ãƒ—ルプãƒã‚°ãƒ©ãƒ を示ã—ã¾ã™ã€‚
#include <iostream>
#include <string>
#include <map>
typedef std::multimap<int ,std::string , std::less<int> > MMAP;
typedef MMAP::value_type Mvalue;
std::ostream& operator<<(std::ostream& os, const Mvalue& p)const{
os << p.second << ": " << p.first;
return os;
}
int main(void){
MMAP m;
m.insert(Mvalue(100,"02kc963"));
m.insert(Mvalue(62,"02kc903"));
m.insert(Mvalue(85,"02kc923"));
m.insert(Mvalue(73,"02kc911"));
m.insert(Mvalue(85,"02kc987"));
std;;cout << "size = " << m.size() << std::endl;
for(MMAP::iterator i=m.begin(),end=m.end(); i!=end; ++i){
std::cout << *i << std::endl;
}
std::cout << "---------------------------------" << std::endl;
for(MMAP::iterator i=m.lower_bound(70), end=m.upper_bound(90);
i!=end; ++i){
std::cout << *i << std::endl;
}
}
ã¾ãŸã€ä¸Šã®ãƒ—ãƒã‚°ãƒ©ãƒ ã§ã¯cout << Mvalue ã®å€¤;
ã¨ã„ã†
構文ã§å€¤ã‚’表示ã§ãるよã†ã«ä»¥ä¸‹ã®ã‚ˆã†ãªé–¢æ•°ã‚’用æ„ã—ã¾ã—ãŸã€‚
C++ 言語ã§ã¯ã“ã®ã‚ˆã†ã«æ¼”ç®—åã‚’å†å®šç¾©ã§ãã¾ã™(乱用ã™ã‚‹ã¨æ··ä¹±ã®ã‚‚ã¨ã§ã™
ãŒ)。
一般ã®ã‚ªãƒ–ジェクト指å‘ã®æ§‹æ–‡ã§ã¯ã€ã‚ªãƒ–ジェクトã¨ã‚ªãƒ–ジェクトã®é–“ã«å…¥ã‚‹æ¼”ç®—å
ã¯ã€å·¦å´ã®ã‚ªãƒ–ジェクトã®ãƒ¡ã‚½ãƒƒãƒ‰ã«ãªã‚Šã¾ã™ã€‚
ãã®ãŸã‚ã€ã“ã“ã§å®šç¾©ã™ã‚‹ã®ã‚‚〠cout ã®ã‚ªãƒ–ジェクト型ã§ã‚ã‚‹ ostream ク
ラスã®æ¼”ç®—å << ã®å†å®šç¾©ã«ãªã‚Šã¾ã™ã€‚
ãªãŠã€ã“ã®å ´åˆã¯ Mvalue åž‹ã®è¡¨ç¤ºã«ãƒ‘ブリックメンãƒã—ã‹ä½¿ã‚ãªã‹ã£ãŸã®ã§ã€
ã“ã®å®šç¾©ã ã‘ã§æ¸ˆã¿ã¾ã™ãŒã€ã‚‚ã—プライベートメンãƒã‚’使用ã—ãªã‘ã‚Œã°ãªã‚‰ãª
ã„時ã¯ã€ãã®ã‚¯ãƒ©ã‚¹ã®å®£è¨€æ™‚ã«ã“ã®æ¼”ç®—åã®å†å®šç¾©ã«å¯¾ã—ã¦fried
指定をã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
std::ostream& operator<<(std::ostream& os, const Mvalue& p){
os << p.second << ": " << p.first;
return os;
}