2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」

Slides:



Advertisements
Similar presentations
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Advertisements

【事例演習5】  字句解析     解 説  “ハッシュを用いた字句解析の方法”.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報処理演習C2 ファイル操作について (2).
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
データ構造とアルゴリズム 第10回 mallocとfree
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
情報工学概論 (アルゴリズムとデータ構造)
記憶クラス 変数をどのような記憶領域に割り当てるかを指定するのが記憶クラス 記憶クラスには、自動変数、静的変数、外部変数などがある。
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
構造体.
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
データ構造と アルゴリズム 第十一回 理工学部 情報システム工学科 新田直也.
構造体 構造体, 構造体とポインタの組み合わせ,.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
データ構造とプログラミング技法 (第2回) ー線形構造ー.
ハッシュテーブル.
Cプログラミング演習 中間まとめ2.
データ構造とアルゴリズム (第2回) ー線形構造ー.
情報処理演習 (秋学期・樋口担当) 3回目 10/8 日本工業大学 コンピュータリテラシーII.
第11回 宿題 出題日:12月21日 締切日:1月7日(木).
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング序論 2. n人のインディアン.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
第11回 プログラミングⅡ 第11回
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラミング基礎B 文字列の扱い.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
C言語演習 情報ネットワーク特論.
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
B演習(言語処理系演習)第2回 田浦.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング基礎a 第6回 C言語によるプログラミング入門 配列と文字列(その2)
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
コンパイラ 2012年10月29日
ネットワーク・プログラミング Cプログラミングの基礎.
ファイル操作について (1).
プログラミング 4 文字列.
C言語プログラミング・課題 ファイルを読み込んで、その内容を表示するプログラムを作成せよ。
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
printf・scanf・変数・四則演算
知能情報工学演習I 第11回(後半第5回) 課題の回答
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」 2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」 西尾 信彦 nishio@cs.ritsumei.ac.jp 立命館大学情報理工学部 情報システム学科

O(log n)よりも高速な探索 配列のインデックスとキーを一致させればO(1)である!!! キーの範囲だけの大きさの配列が必要 非実用的 キーから配列のインデックスに変換する適切な関数を作成,これをハッシュ関数という 均等に分配するような関数 キーを100で割れば大きさは100分の1になる 同じハッシュ値となるレコードは同じハッシュバケットに入る

ハッシュ関数 キーのとりうる範囲を一定の範囲(0~M-1)する ハッシュの衝突は極力避けたい 例えば,整数のキーであれば剰余系を利用する 均等に分散させるため 例えば,整数のキーであれば剰余系を利用する 文字列によるキーの場合 頭の数文字で生成するのはダメ 同じ文字セットの順番が変っていたら違うハッシュ値が欲しい KnuthやWeinbergの例を参照 ハッシュ関数自体のコストがかかっていたらそもそもダメ

分離連鎖法 ハッシュ値の衝突を許容し 計算の手間はN/M? ハッシュバケットをリストで生成する 各ハッシュ値のリストの先頭からなる配列を用意する ハッシュ関数でバケットを選択して,リストを逐次検索 計算の手間はN/M? 適切なMの選び方 バケットを構成するリストを工夫する

上図のような入力ファイルを用いて,データ入力を行い,キーボードから検索キーを入力し,リストにあるかどうかを調べる Hash 分離連鎖法の例: 実行結果: bucket[0] Jamaica bucket[0] France bucket[0] China . bucket[12] Belguim bucket[12] Argentina 検索ワード:Japan Japan が見つかりました. 入力ファイル #include <stdio.h> #include <stdlib.h> #include <string.h> #define HASHSIZE 13 #define STR_MAX 256 typedef struct _listelem{ struct _listelem *next; char *s; }listelem, *list; list bucket[HASHSIZE]; char *word; unsigned long hashpjw(unsigned char* str){ unsigned long hash = 0, g; for( ; *str; ++str){ hash = (hash << 4) + *str; if((g = hash & 0xf0000000)){ hash ^= g >> 24; hash ^= g; } return hash; Afghanistan Albania Algeria Andorra Angola . Kenya Kiribati Korea 上図のような入力ファイルを用いて,データ入力を行い,キーボードから検索キーを入力し,リストにあるかどうかを調べる

Hash 分離連鎖法の例: char *search_add(char *s, int flag){ int h; list l;     h = hashpjw(s) % HASHSIZE; /* ハッシュ値を算出 */     for(l = bucket[h]; l; l = l->next){        if(strcmp(l->s, s) == 0) return l->s;     }     if(flag == 0) return NULL;     l = (list)malloc(sizeof(listelem));     l->s = s;     l->next = bucket[h];     bucket[h] = l;     return l->s; } void RegistryList(char *filename){    FILE *fpIn;    char str[STR_MAX], tmp[STR_MAX];    int i, start;    if((fpIn = fopen(filename, "r")) == NULL){     fprintf(stderr, "Cannot open file [%s].\n", filename);     exit(1);    }     while(fgets(str, STR_MAX, fpIn) != NULL){   sscanf(str, "%s", tmp); word = (char *)malloc(sizeof(char)*strlen(tmp)); strcpy(word, tmp);   /* リストへの登録を行うので,第二引数を0以外にしておく */ search_add(word, 1);     fclose(fpIn); int main(int argc, char **argv){     int i;     list p;     char input[STR_MAX];     /* ファイルから読み込んだデータをリストに格納 */     RegistryList(argv[1]);     for(i = 0; i < HASHSIZE ; i++){          for(p = bucket[i]; p != NULL ; p = p->next){     printf("bucket[%d] %s\n", i, p->s); }     }     printf("検索ワード:");     scanf("%s", input);     /* 検索のみなので,第二引数のflagを0にする */     if(search_add(input, 0) != NULL){ printf("%s が見つかりました.\n", input);     else{ printf("%s は見つかりませんでした.\n", input);      }