JPH1115836A - 文字列探索用テーブル、その作成方法及び文字列探索方法 - Google Patents
文字列探索用テーブル、その作成方法及び文字列探索方法Info
- Publication number
- JPH1115836A JPH1115836A JP9163913A JP16391397A JPH1115836A JP H1115836 A JPH1115836 A JP H1115836A JP 9163913 A JP9163913 A JP 9163913A JP 16391397 A JP16391397 A JP 16391397A JP H1115836 A JPH1115836 A JP H1115836A
- Authority
- JP
- Japan
- Prior art keywords
- character string
- processing
- procedure
- character
- reserved word
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 208
- FFBHFFJDDLITSX-UHFFFAOYSA-N benzyl N-[2-hydroxy-4-(3-oxomorpholin-4-yl)phenyl]carbamate Chemical compound OC1=C(NC(=O)OCC2=CC=CC=C2)C=CC(=C1)N1CCOCC1=O FFBHFFJDDLITSX-UHFFFAOYSA-N 0.000 claims description 5
- 230000001174 ascending effect Effects 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 230000009191 jumping Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
(57)【要約】
【課題】 ハッシュ法よりも演算時間が少なく高速な文
字列探索方法を提供する。 【解決手段】 入力されうる全ての文字を行、文字列探
索状況を示す状態値を列とする二次元の配列状で、その
各要素に、あらかじめ全ての予約語の探索状態に応じて
状態値を変更する処理へのアドレスもしくは予約語を探
索した場合の処理へのアドレスを格納した文字列探索用
テーブルを使い、一文字入力される毎に入力文字と状態
値に応じた文字列探索用テーブルの要素内に設定されて
いるアドレスへジャンプして上記の処理を実行し、再び
一文字入力に戻り、これを繰り返す。また、文字列探索
用テーブルには、登録するべき予約語をソートしてか
ら、それまでの登録状況を考慮しながら独自の方法によ
り状態数を拡張しながら1語つづ登録していく。
字列探索方法を提供する。 【解決手段】 入力されうる全ての文字を行、文字列探
索状況を示す状態値を列とする二次元の配列状で、その
各要素に、あらかじめ全ての予約語の探索状態に応じて
状態値を変更する処理へのアドレスもしくは予約語を探
索した場合の処理へのアドレスを格納した文字列探索用
テーブルを使い、一文字入力される毎に入力文字と状態
値に応じた文字列探索用テーブルの要素内に設定されて
いるアドレスへジャンプして上記の処理を実行し、再び
一文字入力に戻り、これを繰り返す。また、文字列探索
用テーブルには、登録するべき予約語をソートしてか
ら、それまでの登録状況を考慮しながら独自の方法によ
り状態数を拡張しながら1語つづ登録していく。
Description
【0001】
【発明の属する技術分野】本発明は文字列探索方法に関
し、特に文字列探索用テーブルを用いることにより高速
に文字列探索可能とした文字列探索方法に関する。ま
た、その文字列探索用テーブルと、その作成方法に関す
る。
し、特に文字列探索用テーブルを用いることにより高速
に文字列探索可能とした文字列探索方法に関する。ま
た、その文字列探索用テーブルと、その作成方法に関す
る。
【0002】
【従来の技術】従来の一般的な文字列探索方法として、
逐次探索方法、2分木探索方法、ハッシュ探索方法があ
るが、各々の探索方法の平均探索回数は、与えられた文
字列がそれらの中のどれかに一致しているかどうかを探
索する予約語数をNとおくと、逐次探索方法:(N+
1)/2回、2分木探索方法:Log2 N回、ハッシュ
探索方法:1回(ただし条件による)となり、ハッシュ
探索方法を除き、予約語数が増加するにつれ探索回数も
増加するため高速に予約語の探索をすることが困難であ
った。そのため、従来技術ではハッシュ探索方法が最も
高速な探索方法であった。
逐次探索方法、2分木探索方法、ハッシュ探索方法があ
るが、各々の探索方法の平均探索回数は、与えられた文
字列がそれらの中のどれかに一致しているかどうかを探
索する予約語数をNとおくと、逐次探索方法:(N+
1)/2回、2分木探索方法:Log2 N回、ハッシュ
探索方法:1回(ただし条件による)となり、ハッシュ
探索方法を除き、予約語数が増加するにつれ探索回数も
増加するため高速に予約語の探索をすることが困難であ
った。そのため、従来技術ではハッシュ探索方法が最も
高速な探索方法であった。
【0003】以下、各方法について詳述する。
【0004】[従来の技術1] 逐次探索方法 逐次探索方法とは、予めN個(N>0)の予約語を文字
列の配列に格納しておき、入力された文字列に対し、こ
の配列の配列要素を1からNまで増加させながら、順次
配列要素内に格納しておいた予約語を参照し、入力され
た文字列と参照した予約語間の文字列の比較を行うこと
で予約語の探索を行う方法である。探索方向が線形なた
め、線形探索方法とも呼ばれる。
列の配列に格納しておき、入力された文字列に対し、こ
の配列の配列要素を1からNまで増加させながら、順次
配列要素内に格納しておいた予約語を参照し、入力され
た文字列と参照した予約語間の文字列の比較を行うこと
で予約語の探索を行う方法である。探索方向が線形なた
め、線形探索方法とも呼ばれる。
【0005】[従来の技術2] 2分木探索方法 2分木探索方法とは、予めN個(N>0)の予約語を、
各ノード(節点)にデータと左右2個のポインタlef
t、rightを持ち、左のポインタleftでつなが
る子孫のデータは自分より小さく、右のポインタrig
htでつながる子孫のデータはすべて自分より大きいよ
うな2分木構造に格納しておき、入力文字列に対し、こ
の2分木構造の根のノードから探索を始め、入力文字列
と予約語の文字列の大小比較を行い、比較した結果が同
じであれば探索終了で、比較した結果が小さい場合はl
eftポインタにつながっている子孫のノードに移動
し、比較した結果が大きい場合はrightポインタに
つながっている子孫のノードに移動し、再び先の入力文
字列と移動先のノードに格納してある予約語との比較を
行い文字列の探索を行う方法である。
各ノード(節点)にデータと左右2個のポインタlef
t、rightを持ち、左のポインタleftでつなが
る子孫のデータは自分より小さく、右のポインタrig
htでつながる子孫のデータはすべて自分より大きいよ
うな2分木構造に格納しておき、入力文字列に対し、こ
の2分木構造の根のノードから探索を始め、入力文字列
と予約語の文字列の大小比較を行い、比較した結果が同
じであれば探索終了で、比較した結果が小さい場合はl
eftポインタにつながっている子孫のノードに移動
し、比較した結果が大きい場合はrightポインタに
つながっている子孫のノードに移動し、再び先の入力文
字列と移動先のノードに格納してある予約語との比較を
行い文字列の探索を行う方法である。
【0006】[従来の技術3] ハッシュ探索方法 データxを0≦h(x)<nの範囲のなるべく一様に分
布する整数に変換する関数h(x)をハッシュ関数とい
い、このハッシュ関数を使って予約語を探索する方法を
ハッシュ探索方法という。簡単なハッシュ関数として
は、データxを整数化して値Mで割り、その余りを関数
値とする。また通例、値Mは素数とする。
布する整数に変換する関数h(x)をハッシュ関数とい
い、このハッシュ関数を使って予約語を探索する方法を
ハッシュ探索方法という。簡単なハッシュ関数として
は、データxを整数化して値Mで割り、その余りを関数
値とする。また通例、値Mは素数とする。
【0007】ハッシュ関数の値を予約語の登録場所に結
びつける代表的な方法は、先の2分探索木をn本用意
し、データxをh(x)番の木に登録する方法と、n個
の予約語を格納する配列を用意しておいて、値h(x)
をこの配列の要素として要素内に直接予約語を登録する
方法である。2分木を用いる方法はn個の予約語を格納
する配列を用意する方法に比較して検索時間がかかるた
め、以下はn個の予約語を格納する配列を使う方法につ
いて述べる。
びつける代表的な方法は、先の2分探索木をn本用意
し、データxをh(x)番の木に登録する方法と、n個
の予約語を格納する配列を用意しておいて、値h(x)
をこの配列の要素として要素内に直接予約語を登録する
方法である。2分木を用いる方法はn個の予約語を格納
する配列を用意する方法に比較して検索時間がかかるた
め、以下はn個の予約語を格納する配列を使う方法につ
いて述べる。
【0008】これは、予めこのハッシュ関数を用いて、
予約語を整数値化して、この整数値を予約語を格納する
配列の要素として予約語を格納しておき、入力された文
字列をハッシュ関数にかけて整数値を得て、この整数値
を予約語を格納しておいた配列の要素として文字列の探
索をする方法である。
予約語を整数値化して、この整数値を予約語を格納する
配列の要素として予約語を格納しておき、入力された文
字列をハッシュ関数にかけて整数値を得て、この整数値
を予約語を格納しておいた配列の要素として文字列の探
索をする方法である。
【0009】例として、図9にハッシュ探索方法におけ
る予約語テーブルの作成フロー、図10にハッシュ関数
の処理フローおよび図11にハッシュ探索方法の処理フ
ローを示す。
る予約語テーブルの作成フロー、図10にハッシュ関数
の処理フローおよび図11にハッシュ探索方法の処理フ
ローを示す。
【0010】ハッシュ探索方法の前処理として、901
にて予約語を格納する配列(ハッシュ表)を用意する。
次に902にてハッシュ関数を作成する(後述)。次に
903にて予約語を902のハッシュ関数に渡し、ハッ
シュ値を得て、このハッシュ値を901の配列の要素と
して、要素内に予約語を格納する。予約語の数だけ90
2から903の処理を繰り返す。
にて予約語を格納する配列(ハッシュ表)を用意する。
次に902にてハッシュ関数を作成する(後述)。次に
903にて予約語を902のハッシュ関数に渡し、ハッ
シュ値を得て、このハッシュ値を901の配列の要素と
して、要素内に予約語を格納する。予約語の数だけ90
2から903の処理を繰り返す。
【0011】ここで902のハッシュ関数の内部処理に
ついて説明する。図10に示すのは、入力された文字列
を整数化して値Mの素数で割り、その余りを関数値とす
る簡単なハッシュ関数902の内部処理の一例である。
まず、1001にて内部変数のうちの1つであるハッシ
ュ値hの値を0で初期化する。同様に内部変数のうちの
1つである文字ポインタsを入力された文字列の頭文字
を示すように初期化する。1002にてポインタsが示
す文字を得て、1003にてこの文字が文字列の終わり
かどうか判断する。終わりであれば1008に進み、終
わりでなければ1004に進む。1004にて変数hの
値を左に8ビットシフト(256倍化)して、さらに1
005にて変数hにポインタsの示す文字の文字コード
値を加算する。次に1006にて変数hの値を先の90
1にて用意したハッシュ表の要素数で割り、これの余り
値を再びhに代入する。次に1007にて文字ポインタ
sを1つ進めて、再び1002からの処理を繰り返す。
この繰り返し処理にて入力された文字列をすべて読み終
えたら、1008にて確定されたハッシュ値hを戻す。
ついて説明する。図10に示すのは、入力された文字列
を整数化して値Mの素数で割り、その余りを関数値とす
る簡単なハッシュ関数902の内部処理の一例である。
まず、1001にて内部変数のうちの1つであるハッシ
ュ値hの値を0で初期化する。同様に内部変数のうちの
1つである文字ポインタsを入力された文字列の頭文字
を示すように初期化する。1002にてポインタsが示
す文字を得て、1003にてこの文字が文字列の終わり
かどうか判断する。終わりであれば1008に進み、終
わりでなければ1004に進む。1004にて変数hの
値を左に8ビットシフト(256倍化)して、さらに1
005にて変数hにポインタsの示す文字の文字コード
値を加算する。次に1006にて変数hの値を先の90
1にて用意したハッシュ表の要素数で割り、これの余り
値を再びhに代入する。次に1007にて文字ポインタ
sを1つ進めて、再び1002からの処理を繰り返す。
この繰り返し処理にて入力された文字列をすべて読み終
えたら、1008にて確定されたハッシュ値hを戻す。
【0012】最後にハッシュ探索方法の処理フローを図
11を参照して述べる。1101にて入力された文字列
を得て、1102で例えば入力文字列長が0であるかど
うかをみることにより文字列入力を終了するかどうかを
判断し、終了でなければ1103に進む。1103にて
入力された文字列を先の902のハッシュ関数に渡し、
これの戻り値を先の901の配列の要素とする。この要
素内に予約語が格納されているかどうかを調べる。11
04にて予約語があった場合、1105の予約語が見つ
かった場合の処理を実行し、再び1101の文字列の入
力に戻る。1103にて予約語が見つからなかった場合
でも、同様に1101に戻る。入力文字列が終わった場
合、1102にて文字列入力の終わりを認識して処理フ
ローを終える。
11を参照して述べる。1101にて入力された文字列
を得て、1102で例えば入力文字列長が0であるかど
うかをみることにより文字列入力を終了するかどうかを
判断し、終了でなければ1103に進む。1103にて
入力された文字列を先の902のハッシュ関数に渡し、
これの戻り値を先の901の配列の要素とする。この要
素内に予約語が格納されているかどうかを調べる。11
04にて予約語があった場合、1105の予約語が見つ
かった場合の処理を実行し、再び1101の文字列の入
力に戻る。1103にて予約語が見つからなかった場合
でも、同様に1101に戻る。入力文字列が終わった場
合、1102にて文字列入力の終わりを認識して処理フ
ローを終える。
【0013】
【発明が解決しようとする課題】ところで、ここでの第
1の問題点は、ハッシュ探索方法はあらかじめそれぞれ
の予約語を、ハッシュ関数にてなるべく一様に分布する
整数値に変換し、その整数値を予約語を格納する配列の
要素番号として各々の予約語を格納するが、登録を行う
予約語数および1予約語を構成する文字数によってはハ
ッシュ値が重複する場合がある。
1の問題点は、ハッシュ探索方法はあらかじめそれぞれ
の予約語を、ハッシュ関数にてなるべく一様に分布する
整数値に変換し、その整数値を予約語を格納する配列の
要素番号として各々の予約語を格納するが、登録を行う
予約語数および1予約語を構成する文字数によってはハ
ッシュ値が重複する場合がある。
【0014】その理由は、一般に、計算機の内部表現に
おいて1文字をnビットで表現している場合、1文字列
を構成する文字数をmとおくと、文字列固有の整数値を
表現するにはn×mビットが必要となるが、ハッシュ値
もn×mビットで表現できなければ、その整数値を1対
1に写像することができないということである。例え
ば、32ビットのCPUのレジスタ長(32ビット)で
扱えるハッシュ値をもとの文字列から写像しようとした
場合、文字がASCIIコード(1文字=8ビット)で
あるとしても、4文字長の文字列しか1対1に写像でき
ないことになる。よって4文字を超える文字列のハッシ
ュ値を求める際にハッシュ値が重複する可能性がある。
おいて1文字をnビットで表現している場合、1文字列
を構成する文字数をmとおくと、文字列固有の整数値を
表現するにはn×mビットが必要となるが、ハッシュ値
もn×mビットで表現できなければ、その整数値を1対
1に写像することができないということである。例え
ば、32ビットのCPUのレジスタ長(32ビット)で
扱えるハッシュ値をもとの文字列から写像しようとした
場合、文字がASCIIコード(1文字=8ビット)で
あるとしても、4文字長の文字列しか1対1に写像でき
ないことになる。よって4文字を超える文字列のハッシ
ュ値を求める際にハッシュ値が重複する可能性がある。
【0015】また、第2の問題点は、ハッシュ関数を複
数化(多段化)して必ずユニークな値を生成できるよう
にしてもハッシュ関数内の演算に要する時間が増えてし
まいユニークな値の生成に時間がかかることである。
数化(多段化)して必ずユニークな値を生成できるよう
にしてもハッシュ関数内の演算に要する時間が増えてし
まいユニークな値の生成に時間がかかることである。
【0016】その理由は、現状のCPUの中では演算命
令、特に乗除算命令は他の命令、例として分岐命令と比
較して時間がかかるものであるが、特に第1の問題点に
て述べたように、ハッシュ関数内にて、ハッシュ関数値
がCPUの扱えるデータビット数を超えるような場合に
は必ず除算は必要となるということである。ハッシュ関
数を複数化すると乗除算命令を多数回使用しなければな
らなくなり、演算時間が増えてしまう。
令、特に乗除算命令は他の命令、例として分岐命令と比
較して時間がかかるものであるが、特に第1の問題点に
て述べたように、ハッシュ関数内にて、ハッシュ関数値
がCPUの扱えるデータビット数を超えるような場合に
は必ず除算は必要となるということである。ハッシュ関
数を複数化すると乗除算命令を多数回使用しなければな
らなくなり、演算時間が増えてしまう。
【0017】例としてμPD70208における各演算
時間は以下の通りである。
時間は以下の通りである。
【0018】 加算: 14クロック 減算: 14クロック 乗算: 39クロック 除算: 34クロック 比較: 16クロック 8ビット左シフト: 15クロック 分岐: 15クロック 以上、2つの問題が文字列探索の高速化を妨げている。
【0019】そこで本発明は、高速な文字列探索方法を
提供することを目的とする。
提供することを目的とする。
【0020】
【課題を解決するための手段】本発明による文字列探索
方法は、入力されうる全ての文字種類を行とし、文字列
探索処理状態を示す状態値種類を列とする2次元配列構
造のテーブルであり、各配列要素に、予め全ての予約語
の探索処理状態に応じて決められた状態値を変更する処
理手順へ分岐する分岐先アドレス、もしくは前記予約語
が探索された場合の処理手順へ分岐する分岐先アドレス
が格納されている文字列探索用テーブルを用いて、入力
された文字列が予め定められた予約語であるかどうか探
索する文字列探索方法において、状態値を0に初期化す
る第1の手順と、一文字ずつ入力文字を得る第2の手順
と、前記得られた入力文字を行、状態値を列として前記
文字列探索用テーブルを参照し、要素内に格納されてい
るアドレスに分岐する第3の手順と、分岐アドレスに従
い、状態値の変更処理もしくは予約語一致処理を実行
し、再び第2の手順に戻る第4の手順とを有することを
特徴とする。
方法は、入力されうる全ての文字種類を行とし、文字列
探索処理状態を示す状態値種類を列とする2次元配列構
造のテーブルであり、各配列要素に、予め全ての予約語
の探索処理状態に応じて決められた状態値を変更する処
理手順へ分岐する分岐先アドレス、もしくは前記予約語
が探索された場合の処理手順へ分岐する分岐先アドレス
が格納されている文字列探索用テーブルを用いて、入力
された文字列が予め定められた予約語であるかどうか探
索する文字列探索方法において、状態値を0に初期化す
る第1の手順と、一文字ずつ入力文字を得る第2の手順
と、前記得られた入力文字を行、状態値を列として前記
文字列探索用テーブルを参照し、要素内に格納されてい
るアドレスに分岐する第3の手順と、分岐アドレスに従
い、状態値の変更処理もしくは予約語一致処理を実行
し、再び第2の手順に戻る第4の手順とを有することを
特徴とする。
【0021】本発明による文字列探索用テーブル作成方
法は、入力されうる全ての文字種類を行とし、文字列探
索処理状態を示す状態値種類を列とする2次元配列構造
のテーブルであり、各配列要素に、予め全ての予約語の
探索処理状態に応じて決められた状態値を変更する処理
手順へ分岐する分岐先アドレス、もしくは前記予約語が
探索された場合の処理手順へ分岐する分岐先アドレスが
格納されている文字列探索用テーブルを作成する文字列
探索用テーブル作成方法において、入力されうる全ての
文字種類を前記文字列探索用テーブルの行方向の大きさ
とする第1の手順と、文字列探索状況の初期値を示す状
態値「0」と状態値を「0」に変更する処理部「処理
0」を用意する第2の手順と、前記文字列探索用テーブ
ルに登録する全ての予約語をソートする第3の手順と、
前記ソートされた全ての予約語から第1の予約語「予約
語1」を取り出し、「予約語1」を構成する1文字目か
らn文字目(nは予約語1の文字列長)までを各々状態
値「1」から状態値「n」として用意する第4の手順
と、状態値「0」から状態値「n」までを前記文字列探
索用テーブルの列方向の大きさとする第5の手順と、状
態値を「1」に変更する処理部「処理1」から、状態値
を「n」に変更する処理部「処理n」までのn個の処理
部を用意する第6の手順と、予約語「予約語1」を探索
した場合の処理「処理予約語1」を用意する第7の手順
と、前記文字列探索用テーブルにおいて、「予約語1」
の1文字目からn文字目までの各文字を行、状態値
「0」から状態値「n−1」までを列とする各々の要素
内に「処理1」から「処理n」への分岐アドレスを格納
する第8の手順と、前記文字列探索用テーブルにおい
て、デリミタ文字を行、状態値「n」を列とする要素内
に処理「処理予約語1」へのアドレスを格納する第9の
手順と、前記ソート後の次の予約語「予約語m」を取り
出し「予約語m」の構成文字数Aを求める第10の手順
と、予約語「予約語m」と予約語「予約語m−1」を比
較し両予約語の1文字目からn文字目まで連続した同じ
文字の数Bを求める第11の手順と、A−Bの分だけ新
規に状態値「n+1」から状態値「n+A−B」までを
用意する第12の手順と、改めて状態値「0」から状態
値「n+A−B」までを前記文字列検索用テーブルの列
方向の大きさとする第13の手順と、状態値を「n+
1」に変更する処理部「処理n+1」から、状態値を
「n+A−B」に変更する処理部「処理n+A−B」ま
でA−B個の処理部を各々用意する第14の手順と、予
約語「予約語m」を探索した場合の処理「処理予約語
m」を用意する第15の手順と、前記文字列探索用テー
ブルにおいて、前記「予約語m」のB+1文字目を行、
状態値「B」を列とする要素内に処理部「処理n+1」
への分岐アドレスを格納する第16の手順と、前記文字
列探索用テーブルにおいて、前記「予約語m」のB+2
文字目からA文字目までの各文字を行、前記状態値「n
+1 」から「n+A−B−1」を列とする各々の要素内
に「処理n+2」から処理「n+A−B」への分岐アド
レスを格納する第17の手順と、前記文字列探索用テー
ブルにおいて、デリミタ文字を行、状態値「n+A−
B」を列とする要素内に処理「処理予約語m」へのアド
レスを格納する第18の手順と、状態値「n」に状態値
「n+A−B」を代入する第19の手順と、前記ソート
した残りの全ての予約語について、第10の手順から第
19の手順まで繰り返し、全ての予約語の登録が終わっ
た後、前記文字列探索用テーブルの要素内のうち、何も
格納していない要素内に処理部「処理0」への分岐アド
レスを格納する第20の手順とを有することを特徴とす
る。
法は、入力されうる全ての文字種類を行とし、文字列探
索処理状態を示す状態値種類を列とする2次元配列構造
のテーブルであり、各配列要素に、予め全ての予約語の
探索処理状態に応じて決められた状態値を変更する処理
手順へ分岐する分岐先アドレス、もしくは前記予約語が
探索された場合の処理手順へ分岐する分岐先アドレスが
格納されている文字列探索用テーブルを作成する文字列
探索用テーブル作成方法において、入力されうる全ての
文字種類を前記文字列探索用テーブルの行方向の大きさ
とする第1の手順と、文字列探索状況の初期値を示す状
態値「0」と状態値を「0」に変更する処理部「処理
0」を用意する第2の手順と、前記文字列探索用テーブ
ルに登録する全ての予約語をソートする第3の手順と、
前記ソートされた全ての予約語から第1の予約語「予約
語1」を取り出し、「予約語1」を構成する1文字目か
らn文字目(nは予約語1の文字列長)までを各々状態
値「1」から状態値「n」として用意する第4の手順
と、状態値「0」から状態値「n」までを前記文字列探
索用テーブルの列方向の大きさとする第5の手順と、状
態値を「1」に変更する処理部「処理1」から、状態値
を「n」に変更する処理部「処理n」までのn個の処理
部を用意する第6の手順と、予約語「予約語1」を探索
した場合の処理「処理予約語1」を用意する第7の手順
と、前記文字列探索用テーブルにおいて、「予約語1」
の1文字目からn文字目までの各文字を行、状態値
「0」から状態値「n−1」までを列とする各々の要素
内に「処理1」から「処理n」への分岐アドレスを格納
する第8の手順と、前記文字列探索用テーブルにおい
て、デリミタ文字を行、状態値「n」を列とする要素内
に処理「処理予約語1」へのアドレスを格納する第9の
手順と、前記ソート後の次の予約語「予約語m」を取り
出し「予約語m」の構成文字数Aを求める第10の手順
と、予約語「予約語m」と予約語「予約語m−1」を比
較し両予約語の1文字目からn文字目まで連続した同じ
文字の数Bを求める第11の手順と、A−Bの分だけ新
規に状態値「n+1」から状態値「n+A−B」までを
用意する第12の手順と、改めて状態値「0」から状態
値「n+A−B」までを前記文字列検索用テーブルの列
方向の大きさとする第13の手順と、状態値を「n+
1」に変更する処理部「処理n+1」から、状態値を
「n+A−B」に変更する処理部「処理n+A−B」ま
でA−B個の処理部を各々用意する第14の手順と、予
約語「予約語m」を探索した場合の処理「処理予約語
m」を用意する第15の手順と、前記文字列探索用テー
ブルにおいて、前記「予約語m」のB+1文字目を行、
状態値「B」を列とする要素内に処理部「処理n+1」
への分岐アドレスを格納する第16の手順と、前記文字
列探索用テーブルにおいて、前記「予約語m」のB+2
文字目からA文字目までの各文字を行、前記状態値「n
+1 」から「n+A−B−1」を列とする各々の要素内
に「処理n+2」から処理「n+A−B」への分岐アド
レスを格納する第17の手順と、前記文字列探索用テー
ブルにおいて、デリミタ文字を行、状態値「n+A−
B」を列とする要素内に処理「処理予約語m」へのアド
レスを格納する第18の手順と、状態値「n」に状態値
「n+A−B」を代入する第19の手順と、前記ソート
した残りの全ての予約語について、第10の手順から第
19の手順まで繰り返し、全ての予約語の登録が終わっ
た後、前記文字列探索用テーブルの要素内のうち、何も
格納していない要素内に処理部「処理0」への分岐アド
レスを格納する第20の手順とを有することを特徴とす
る。
【0022】本発明による記録媒体は、上記の文字列探
索方法をコンピュータに実行させるためのプログラムを
記録したことを特徴とする。
索方法をコンピュータに実行させるためのプログラムを
記録したことを特徴とする。
【0023】また、本発明による記録媒体は、上記の文
字列探索用テーブル作成方法をコンピュータに実行させ
るためのプログラムを記録したことを特徴とする。
字列探索用テーブル作成方法をコンピュータに実行させ
るためのプログラムを記録したことを特徴とする。
【0024】更に、本発明による記録媒体は、入力され
た文字列が予め定められた予約語であるかどうか探索す
る文字列探索方法で用いる文字列探索用テーブルを記録
した記録媒体において、入力されうる全ての文字種類を
行とし、文字列探索処理状態を示す状態値種類を列とす
る2次元配列構造のテーブルであり、各配列要素に、予
め全ての予約語の探索処理状態に応じて決められた状態
値を変更する処理手順へ分岐する分岐先アドレス、もし
くは前記予約語が探索された場合の処理手順へ分岐する
分岐先アドレスが格納されている文字列探索用テーブル
を記録したことを特徴とする。
た文字列が予め定められた予約語であるかどうか探索す
る文字列探索方法で用いる文字列探索用テーブルを記録
した記録媒体において、入力されうる全ての文字種類を
行とし、文字列探索処理状態を示す状態値種類を列とす
る2次元配列構造のテーブルであり、各配列要素に、予
め全ての予約語の探索処理状態に応じて決められた状態
値を変更する処理手順へ分岐する分岐先アドレス、もし
くは前記予約語が探索された場合の処理手順へ分岐する
分岐先アドレスが格納されている文字列探索用テーブル
を記録したことを特徴とする。
【0025】
【発明の実施の形態】以下に示す順序で説明を進める。
【0026】A.文字列探索用テーブルの作成方法 B.文字列探索用テーブルを使用した文字列探索方法
【0027】本実施形態では扱う文字をASCIIコード系
の文字とし、入力されうる文字は16進表記で0x00から
0x7Fまでの128種の文字とする。入力されうる文字は
128種なので文字列探索用テーブルの文字要素数は1
28個となる。また、文字列と文字列を区切る文字(こ
れをデリミタと定義する)を空白文字(文字コード0x2
0)とする。ここで予約語を以下のように定義する。
の文字とし、入力されうる文字は16進表記で0x00から
0x7Fまでの128種の文字とする。入力されうる文字は
128種なので文字列探索用テーブルの文字要素数は1
28個となる。また、文字列と文字列を区切る文字(こ
れをデリミタと定義する)を空白文字(文字コード0x2
0)とする。ここで予約語を以下のように定義する。
【0028】 NEC XYZ NIMS NET まず、文字列探索処理状態の状態値「0」を用意して、
状態値を「0」に変更する処理部「処理0」を以下のよう
に定義する。
状態値を「0」に変更する処理部「処理0」を以下のよう
に定義する。
【0029】
【表1】 次に予約語をソートする。これは昇順でも降順でもかま
わない。本例では昇順にソートする。ソート後は以下の
ような並びになる。
わない。本例では昇順にソートする。ソート後は以下の
ような並びになる。
【0030】 NEC NET NIMS XYZ まず初めの予約語NECは3文字から構成されているた
め、3つの新規状態値「1」、「2」、「3」を用意す
る。よって予約語NECを認識するための文字列探索用テ
ーブルは図4のように用意する。
め、3つの新規状態値「1」、「2」、「3」を用意す
る。よって予約語NECを認識するための文字列探索用テ
ーブルは図4のように用意する。
【0031】次にこれら3つの状態値に対応した状態値
を更新する処理部を3つ用意する。ここで3つの各処理
部を「処理1」、「処理2」、「処理3」と定義し、各処
理部へのアドレスが得られるようにラベル化しておく。
また予約語NECを探索した場合の処理部「処理NEC」も作
成する。
を更新する処理部を3つ用意する。ここで3つの各処理
部を「処理1」、「処理2」、「処理3」と定義し、各処
理部へのアドレスが得られるようにラベル化しておく。
また予約語NECを探索した場合の処理部「処理NEC」も作
成する。
【0032】これら各処理部を以下に示す。
【0033】
【表2】 各処理内容中の「読み出し処理部」は後述のフロー説明
で述べる。また、「処理NEC」内の予約語NECを探索した
場合の処理は任意の処理である。
で述べる。また、「処理NEC」内の予約語NECを探索した
場合の処理は任意の処理である。
【0034】次に予約語NECの1文字目「N」と状態値
「0」より図4の文字列探索用テーブルを参照して、状
態値が「0」で文字要素が「N」の要素内に「処理1」へ
の分岐アドレスを格納する。同様に2文字目の「E」と
状態値「1」より図4の文字列探索用テーブルを参照し
て、状態値が「1」で文字要素が「E」の要素内に「処理
2」への分岐アドレスを格納する。同様に3文字目の
「C」と状態値「2」より図4の文字列探索用テーブルを
参照して、状態値が「2」で文字要素が「C」の要素内に
「処理3」への分岐アドレスを格納する。最後にデリミ
タの「空白文字」と状態値「3」より図4の文字列探索
用テーブルを参照して、状態値が「3」で文字要素がデ
リミタの要素内に「処理NEC」への分岐アドレスを格納
する。以上で予約語NECを探索するための文字列探索用
テーブルは完成である。この結果得られた文字列探索用
テーブルを図5に示す。
「0」より図4の文字列探索用テーブルを参照して、状
態値が「0」で文字要素が「N」の要素内に「処理1」へ
の分岐アドレスを格納する。同様に2文字目の「E」と
状態値「1」より図4の文字列探索用テーブルを参照し
て、状態値が「1」で文字要素が「E」の要素内に「処理
2」への分岐アドレスを格納する。同様に3文字目の
「C」と状態値「2」より図4の文字列探索用テーブルを
参照して、状態値が「2」で文字要素が「C」の要素内に
「処理3」への分岐アドレスを格納する。最後にデリミ
タの「空白文字」と状態値「3」より図4の文字列探索
用テーブルを参照して、状態値が「3」で文字要素がデ
リミタの要素内に「処理NEC」への分岐アドレスを格納
する。以上で予約語NECを探索するための文字列探索用
テーブルは完成である。この結果得られた文字列探索用
テーブルを図5に示す。
【0035】続いて2つ目以降の予約語を登録してい
く。2つ目以降の予約語を登録する場合、新規に状態値
を用意する必要があるかどうか、以下に述べる計算式に
従い判断する必要がある。
く。2つ目以降の予約語を登録する場合、新規に状態値
を用意する必要があるかどうか、以下に述べる計算式に
従い判断する必要がある。
【0036】これから登録する予約語を構成する文字数
をAとおき、直前に登録した予約語とこれから登録する
予約語において、頭文字から任意文字目まで連続した同
じ文字の数をBとおいた場合、A−Bが新規に必要な状
態数である。新規状態値が必要な場合、必然的に文字列
探索用テーブルを状態値要素方向に拡張しなければなら
ない。
をAとおき、直前に登録した予約語とこれから登録する
予約語において、頭文字から任意文字目まで連続した同
じ文字の数をBとおいた場合、A−Bが新規に必要な状
態数である。新規状態値が必要な場合、必然的に文字列
探索用テーブルを状態値要素方向に拡張しなければなら
ない。
【0037】本例では、第2に登録する予約語はNET
で、予約語NETは計3文字であるのでA=3である。次
に直前に登録した予約語NECと今回登録する予約語NETに
おいて、頭文字から任意文字目まで同じ文字数を調べ
る。予約語NECと予約語NETでは、「N」、「E」が同じで
あり、計2文字が同じであるのでB=2である。ゆえ
に、A−B=1となり、新規の状態値を1つ用意する必
要がある。よって新たに状態値「4」を用意し、文字列
探索用テーブルの状態値要素方向(列方向)の要素を状
態値「0」から状態値「4」までとする。また新たに状態
値を更新する処理「処理4」および予約語NETを探索した
場合の処理「処理NET」を設ける。この「処理4」と「処
理NET」を以下のように定義する。
で、予約語NETは計3文字であるのでA=3である。次
に直前に登録した予約語NECと今回登録する予約語NETに
おいて、頭文字から任意文字目まで同じ文字数を調べ
る。予約語NECと予約語NETでは、「N」、「E」が同じで
あり、計2文字が同じであるのでB=2である。ゆえ
に、A−B=1となり、新規の状態値を1つ用意する必
要がある。よって新たに状態値「4」を用意し、文字列
探索用テーブルの状態値要素方向(列方向)の要素を状
態値「0」から状態値「4」までとする。また新たに状態
値を更新する処理「処理4」および予約語NETを探索した
場合の処理「処理NET」を設ける。この「処理4」と「処
理NET」を以下のように定義する。
【0038】
【表3】 次に、予約語NETにおける3文字目(B+1文字目)の
「T」と状態値「2」(状態値「B」)より文字列探索用
テーブルを参照し、状態値が「2」で文字要素が「T」の
要素内に処理部「処理4」への分岐アドレスを格納す
る。次にデリミタ文字と状態値「4」(状態値「n+A
−B」、但しnは1つ前の予約後の登録を終了した時点
での最高の状態値)より文字列探索用テーブルを参照
し、状態値が「4」で文字要素がデリミタの要素内に処
理「予約語NET」への分岐アドレスを格納する。この結
果得られた文字列探索用テーブルを図6に示す。
「T」と状態値「2」(状態値「B」)より文字列探索用
テーブルを参照し、状態値が「2」で文字要素が「T」の
要素内に処理部「処理4」への分岐アドレスを格納す
る。次にデリミタ文字と状態値「4」(状態値「n+A
−B」、但しnは1つ前の予約後の登録を終了した時点
での最高の状態値)より文字列探索用テーブルを参照
し、状態値が「4」で文字要素がデリミタの要素内に処
理「予約語NET」への分岐アドレスを格納する。この結
果得られた文字列探索用テーブルを図6に示す。
【0039】同様に次の予約語NIMSについて考える。直
前に登録した予約語はNETである。これから登録する予
約語を構成する文字数A=4(文字)、直前に登録した
予約語とこれから登録する予約語において、頭文字から
任意文字目まで連続した同じ文字の数B=1(文字)な
ので、A−B=3となり、新たに3つの状態値「5」、
「6」、「7」を設け、改めて文字列探索用テーブルの状
態値要素方向(列方向)の大きさを状態値「0」から状
態値「7」までの大きさとする。また状態値を各々
「5」、「6」、「7」に変更する処理部「処理5」、「処
理6」、「処理7」を設ける。また予約語NIMSを探索した
場合の処理部「処理NIMS」も設ける。これら各処理部を
以下に示す。
前に登録した予約語はNETである。これから登録する予
約語を構成する文字数A=4(文字)、直前に登録した
予約語とこれから登録する予約語において、頭文字から
任意文字目まで連続した同じ文字の数B=1(文字)な
ので、A−B=3となり、新たに3つの状態値「5」、
「6」、「7」を設け、改めて文字列探索用テーブルの状
態値要素方向(列方向)の大きさを状態値「0」から状
態値「7」までの大きさとする。また状態値を各々
「5」、「6」、「7」に変更する処理部「処理5」、「処
理6」、「処理7」を設ける。また予約語NIMSを探索した
場合の処理部「処理NIMS」も設ける。これら各処理部を
以下に示す。
【0040】
【表4】 次に予約語NIMSの2文字目「I」と状態値「1」(最初の
文字が「N」だと状態値は「1」になるので)より文字列
探索用テーブルを参照し、状態値が「1」で文字要素が
「I」の要素内に処理部「処理5」への分岐アドレスを格
納する。同様に予約語NIMSの3文字目から4文字目まで
と、状態値「5」、「6」より文字列探索用テーブルを参
照し、状態値が「5」で文字要素が「M」の要素内に処理
部「処理6」、状態値が「6」で文字要素が「S」の要素
内に「処理7」への分岐アドレスを格納する。最後にデ
リミタ文字と状態値「7」より文字列探索用テーブルを
参照し、状態値が「7」で文字要素がデリミタの要素内
に処理部「処理NIMS」への分岐アドレスを格納する。こ
の結果得られた文字列探索用テーブルを図7に示す。
文字が「N」だと状態値は「1」になるので)より文字列
探索用テーブルを参照し、状態値が「1」で文字要素が
「I」の要素内に処理部「処理5」への分岐アドレスを格
納する。同様に予約語NIMSの3文字目から4文字目まで
と、状態値「5」、「6」より文字列探索用テーブルを参
照し、状態値が「5」で文字要素が「M」の要素内に処理
部「処理6」、状態値が「6」で文字要素が「S」の要素
内に「処理7」への分岐アドレスを格納する。最後にデ
リミタ文字と状態値「7」より文字列探索用テーブルを
参照し、状態値が「7」で文字要素がデリミタの要素内
に処理部「処理NIMS」への分岐アドレスを格納する。こ
の結果得られた文字列探索用テーブルを図7に示す。
【0041】同様に最後の予約語XYZについて考える。
直前に登録した予約語はNIMSである。前回と同様にA、
Bを求めると、A=3文字、B=0文字なので、A−B
=3となり、新たに3つの状態値「8」、「9」、「10」
を設け、改めて状態値「0」から状態値「10」までを文
字列探索用テーブルの列方向の大きさとする。また各々
状態値を「8」、「9」、「10」に変更する各処理部「処
理8」、「処理9」、「処理10」を設ける。また予約語XY
Zを探索した場合の処理「処理XYZ」も設ける。これら処
理部を以下に示す。
直前に登録した予約語はNIMSである。前回と同様にA、
Bを求めると、A=3文字、B=0文字なので、A−B
=3となり、新たに3つの状態値「8」、「9」、「10」
を設け、改めて状態値「0」から状態値「10」までを文
字列探索用テーブルの列方向の大きさとする。また各々
状態値を「8」、「9」、「10」に変更する各処理部「処
理8」、「処理9」、「処理10」を設ける。また予約語XY
Zを探索した場合の処理「処理XYZ」も設ける。これら処
理部を以下に示す。
【0042】
【表5】 次に予約語XYZの1文字目「X」と状態値「0」より文字
列探索用テーブルを参照し、状態値が「0」で文字要素
が「X」の要素内に処理部「処理8」への分岐アドレスを
格納する。同様に予約語XYZの2文字目「Y」から3文字
目「X」と、状態値「8」、「9」より文字列探索用テー
ブルを各々参照して、状態値が「8」で文字要素が「Y」
の要素内に処理部「処理9」、状態値が「9」で文字要素
が「Z」の要素内に「処理10」への分岐アドレスを格納
する。次にデリミタの文字と状態値「10」より文字列探
索用テーブルを参照し、要素内に「処理XYZ」への分岐
アドレスを格納する。この結果得られた文字列探索用テ
ーブルを図8に示す。
列探索用テーブルを参照し、状態値が「0」で文字要素
が「X」の要素内に処理部「処理8」への分岐アドレスを
格納する。同様に予約語XYZの2文字目「Y」から3文字
目「X」と、状態値「8」、「9」より文字列探索用テー
ブルを各々参照して、状態値が「8」で文字要素が「Y」
の要素内に処理部「処理9」、状態値が「9」で文字要素
が「Z」の要素内に「処理10」への分岐アドレスを格納
する。次にデリミタの文字と状態値「10」より文字列探
索用テーブルを参照し、要素内に「処理XYZ」への分岐
アドレスを格納する。この結果得られた文字列探索用テ
ーブルを図8に示す。
【0043】最後に図8の文字列探索用テーブルにおい
て、予約語NECおよびNETおよびNIMSおよびXYZを登録す
る際に使用しなかった他の全ての要素内に「処理0」へ
の分岐アドレスを格納する。これで予約語NEC、NET、NI
MS、XYZに対する文字列探索用テーブルの設定は終わり
である。
て、予約語NECおよびNETおよびNIMSおよびXYZを登録す
る際に使用しなかった他の全ての要素内に「処理0」へ
の分岐アドレスを格納する。これで予約語NEC、NET、NI
MS、XYZに対する文字列探索用テーブルの設定は終わり
である。
【0044】図2を参照して一般化した文字列探索用テ
ーブルの作成手順を説明する。
ーブルの作成手順を説明する。
【0045】第1の手順(201)において、入力され
うる全ての文字種類を文字列探索用テーブルの行方向の
大きさとする。
うる全ての文字種類を文字列探索用テーブルの行方向の
大きさとする。
【0046】第2の手順(202)において、初期状態
値「0」を用意して、状態値を初期状態値にする初期化
処理部「処理0」を用意する。
値「0」を用意して、状態値を初期状態値にする初期化
処理部「処理0」を用意する。
【0047】第3の手順(203)において、登録する
全ての予約語をソート基準に従って、昇順又は降順にソ
ートする。
全ての予約語をソート基準に従って、昇順又は降順にソ
ートする。
【0048】第4の手順(204)において、第1の予
約語に対応した状態値を用意する。この状態値の数
「n」は第1の予約語の文字列長である。通常は状態値
は1から順に用意する。
約語に対応した状態値を用意する。この状態値の数
「n」は第1の予約語の文字列長である。通常は状態値
は1から順に用意する。
【0049】第5の手順(205)において、文字列探
索用テーブルの列方向の大きさを決定する。列は「0」
から「n」まであり、列方向の大きさは、第1の予約語
の文字列長+1である。
索用テーブルの列方向の大きさを決定する。列は「0」
から「n」まであり、列方向の大きさは、第1の予約語
の文字列長+1である。
【0050】第6の手順(206)において、状態値変
更(更新)処理部を用意する。上記の例では、状態値を
「1」に変更(更新)する処理部「処理1」から状態値を
「3(=n)」に変更する処理部「処理3」までを用意する。
更(更新)処理部を用意する。上記の例では、状態値を
「1」に変更(更新)する処理部「処理1」から状態値を
「3(=n)」に変更する処理部「処理3」までを用意する。
【0051】第7の手順(207)において、第1の予
約語を探索した場合の処理部を用意する。上記の例で
は、「処理NEC」を用意する。
約語を探索した場合の処理部を用意する。上記の例で
は、「処理NEC」を用意する。
【0052】第8の手順(208)において、文字列探
索用テーブルに各状態変更処理部への分岐アドレスを格
納する。上記の例では、例えば、状態値が「0」で文字
要素が「N」の要素内に「処理1」への分岐アドレスを格
納する。
索用テーブルに各状態変更処理部への分岐アドレスを格
納する。上記の例では、例えば、状態値が「0」で文字
要素が「N」の要素内に「処理1」への分岐アドレスを格
納する。
【0053】第9の手順(209)において、文字列探
索用テーブルのデリミタ文字を行、状態値「n」を列と
する要素内に第1の予約語を探索した場合の処理部への
分岐アドレスを格納する。上記の例では、状態値が
「3」で文字要素がデリミタの要素内に「処理NEC」への
分岐アドレス格納する。
索用テーブルのデリミタ文字を行、状態値「n」を列と
する要素内に第1の予約語を探索した場合の処理部への
分岐アドレスを格納する。上記の例では、状態値が
「3」で文字要素がデリミタの要素内に「処理NEC」への
分岐アドレス格納する。
【0054】次の予約語がある場合に進む第10の手順
(211)において、これから予約しようとする第m
(mは2以上の整数)の予約語よりこの予約語の構成文
字数Aを求める。
(211)において、これから予約しようとする第m
(mは2以上の整数)の予約語よりこの予約語の構成文
字数Aを求める。
【0055】第11の手順(212)において、第mの
予約語と第(m−1)の予約語の頭文字から連続して一
致する文字の数Bを求める。
予約語と第(m−1)の予約語の頭文字から連続して一
致する文字の数Bを求める。
【0056】第12の手順(213)において、A−B
個の状態値「n+1」から状態値「n+A-B」までを用意する
新規状態を用意する。
個の状態値「n+1」から状態値「n+A-B」までを用意する
新規状態を用意する。
【0057】第13の手順(214)において、文字列
探索用テーブルの列方向の大きさをA−Bだけ拡大し
て、範囲を状態値「0」から状態値「n+A-B」にして更新
する。
探索用テーブルの列方向の大きさをA−Bだけ拡大し
て、範囲を状態値「0」から状態値「n+A-B」にして更新
する。
【0058】第14の手順(215)において、状態値
を「n+1」に変更する処理部「処理n+1」から、状態値を
「n+A-B」に変更する処理部「処理n+A-B」までA−B個
の処理部を各々用意する上記の例では、例えば「NIMS」
を扱っているときに、状態値を「5」に更新する処理部
「処理5」などを用意する。
を「n+1」に変更する処理部「処理n+1」から、状態値を
「n+A-B」に変更する処理部「処理n+A-B」までA−B個
の処理部を各々用意する上記の例では、例えば「NIMS」
を扱っているときに、状態値を「5」に更新する処理部
「処理5」などを用意する。
【0059】第15の手順(216)において、第mの
予約語を探索した場合の処理部を用意する。上記の例で
は、例えば、「処理NIMS」を用意する。
予約語を探索した場合の処理部を用意する。上記の例で
は、例えば、「処理NIMS」を用意する。
【0060】第16の手順(217)において、文字列
探索用テーブルにおいて、「予約語m」のB+1文字目
を行、状態値「B」を列とする要素内に処理部「処理n+
1」への分岐アドレスを格納する。上記の例では、例え
ば「NIMS」を扱っているときに、「NIMS」の2文字目で
ある「I」を行、状態値「1」を列とする要素内に「処理
5」への分岐アドレスを格納する。
探索用テーブルにおいて、「予約語m」のB+1文字目
を行、状態値「B」を列とする要素内に処理部「処理n+
1」への分岐アドレスを格納する。上記の例では、例え
ば「NIMS」を扱っているときに、「NIMS」の2文字目で
ある「I」を行、状態値「1」を列とする要素内に「処理
5」への分岐アドレスを格納する。
【0061】第17の手順(218)において、文字列
探索用テーブルにおいて、「予約語m」のB+2文字目
からA文字目までの各文字を行、前記状態値「n+1」か
ら「n+A-B-1」を列とする各々の要素内に「処理n+2」か
ら処理「n+A-B」への分岐アドレスを格納する。上記の
例では、例えば「NIMS」を扱っているときに、「NIMS」
の3文字目から4文字目までの各文字を行、状態値「5
(=4+1)」から状態値「6(=4+4-1-1)」を列とする各々の
要素内に「処理6」から「処理7」への分岐アドレスを格
納する。
探索用テーブルにおいて、「予約語m」のB+2文字目
からA文字目までの各文字を行、前記状態値「n+1」か
ら「n+A-B-1」を列とする各々の要素内に「処理n+2」か
ら処理「n+A-B」への分岐アドレスを格納する。上記の
例では、例えば「NIMS」を扱っているときに、「NIMS」
の3文字目から4文字目までの各文字を行、状態値「5
(=4+1)」から状態値「6(=4+4-1-1)」を列とする各々の
要素内に「処理6」から「処理7」への分岐アドレスを格
納する。
【0062】第18の手順(219)において、文字列
探索用テーブルにおいて、デリミタ文字を行、状態値
「n+A-B」を列とする要素内に処理「処理予約語m」への
アドレスを格納する。上記の例では、例えば「NIMS」を
扱っているときに、デリミタ文字を行、状態値「7(=4+4
-1)」を列とする要素内に「処理NIMS」へのアドレスを
格納する。
探索用テーブルにおいて、デリミタ文字を行、状態値
「n+A-B」を列とする要素内に処理「処理予約語m」への
アドレスを格納する。上記の例では、例えば「NIMS」を
扱っているときに、デリミタ文字を行、状態値「7(=4+4
-1)」を列とする要素内に「処理NIMS」へのアドレスを
格納する。
【0063】第19の手順(220)において、状態値
「n」に状態値「n+A-B」を代入する。上記の例では、例
えば「NET」を扱っているときに状態値「3」に状態値
「4(=3+3-2)」を代入する。
「n」に状態値「n+A-B」を代入する。上記の例では、例
えば「NET」を扱っているときに状態値「3」に状態値
「4(=3+3-2)」を代入する。
【0064】次の予約語がない場合にすすむ第20の手
順(221)において、文字列探索用テーブルの要素内
のうち、何も格納していない要素内に処理部「処理0」
への分岐アドレスを格納する。
順(221)において、文字列探索用テーブルの要素内
のうち、何も格納していない要素内に処理部「処理0」
への分岐アドレスを格納する。
【0065】次に本実施形態の文字列探索の処理フロー
について述べる。図3が本実施形態における文字列探索
方法の処理フローである。まず300にて状態値を
「0」に初期化する。ここで例として文字列NEC、次いで
デリミタの空白文字が入力される場合を考える。はじめ
に読み出し処理部301にて文字「N」が読み込まれ
る。
について述べる。図3が本実施形態における文字列探索
方法の処理フローである。まず300にて状態値を
「0」に初期化する。ここで例として文字列NEC、次いで
デリミタの空白文字が入力される場合を考える。はじめ
に読み出し処理部301にて文字「N」が読み込まれ
る。
【0066】次に302にて図6に示す文字列探索用テ
ーブル内の文字要素が「N」で状態値要素が「0」の位置
に格納されている「処理1」のアドレスを得て、303
の中の一つの処理「処理1」にジャンプし、「処理1」に
おいて状態値を「1」に更新して、再び301の読み出
し処理部へ戻る。同様に、302にて図6に示す文字列
探索用テーブル内の文字要素が次の入力文字「E」で状
態値要素が「1」の位置に格納されている「処理2」のア
ドレスを得て、302の「処理2」へジャンプし、「処
理2」において状態値を「2」に更新して再び301の読
み出し処理部へ戻る。
ーブル内の文字要素が「N」で状態値要素が「0」の位置
に格納されている「処理1」のアドレスを得て、303
の中の一つの処理「処理1」にジャンプし、「処理1」に
おいて状態値を「1」に更新して、再び301の読み出
し処理部へ戻る。同様に、302にて図6に示す文字列
探索用テーブル内の文字要素が次の入力文字「E」で状
態値要素が「1」の位置に格納されている「処理2」のア
ドレスを得て、302の「処理2」へジャンプし、「処
理2」において状態値を「2」に更新して再び301の読
み出し処理部へ戻る。
【0067】更に、302にて図6に示す文字列探索用
テーブル内の文字要素が次の入力文字「C」で状態値要
素が「2」の位置に格納されている「処理3」のアドレス
を得て、303の「処理3」へジャンプし、「処理3」に
おいて状態値を「3」に更新して再び301の読み出し
処理部へ戻る。
テーブル内の文字要素が次の入力文字「C」で状態値要
素が「2」の位置に格納されている「処理3」のアドレス
を得て、303の「処理3」へジャンプし、「処理3」に
おいて状態値を「3」に更新して再び301の読み出し
処理部へ戻る。
【0068】更に、302にて図6に示す文字列探索用
テーブル内の文字要素が次の入力文字「空白文字」で状
態値要素が「3」の位置に格納されている「処理NEC」の
アドレスを得て、303の「処理NEC」へジャンプす
る。「処理NEC」にジャンプした時点で予約語NECを探索
したことになる。
テーブル内の文字要素が次の入力文字「空白文字」で状
態値要素が「3」の位置に格納されている「処理NEC」の
アドレスを得て、303の「処理NEC」へジャンプす
る。「処理NEC」にジャンプした時点で予約語NECを探索
したことになる。
【0069】次に、「処理NEC」内の予約語NECを探索し
た場合の処理を実行し、状態値を「0」に更新して、再
び301の文字読み出し部に戻り、次の文字列の探索に
備える。
た場合の処理を実行し、状態値を「0」に更新して、再
び301の文字読み出し部に戻り、次の文字列の探索に
備える。
【0070】また別の例として予約語に含まれない文字
列「ABC」が入力された場合を考える。プログラムの初
期状態において、状態値は「0」である。はじめに30
1の読み出し処理部にて文字「A」が読み込まれる。次
に302にて図6の示す文字列探索用テーブル内の文字
要素が「A」で状態値要素が「0」の位置に格納されてい
るアドレス「処理0」を得て、303の「処理0」にジャ
ンプし、「処理0」において状態値を「0」に更新して、
再び読み出し処理部へ戻る。すなわち状態値は「0」か
ら変わらない。以降の入力文字「B」、「C」に関しても
同様であるため、入力された文字列ABCは無視される
のである。
列「ABC」が入力された場合を考える。プログラムの初
期状態において、状態値は「0」である。はじめに30
1の読み出し処理部にて文字「A」が読み込まれる。次
に302にて図6の示す文字列探索用テーブル内の文字
要素が「A」で状態値要素が「0」の位置に格納されてい
るアドレス「処理0」を得て、303の「処理0」にジャ
ンプし、「処理0」において状態値を「0」に更新して、
再び読み出し処理部へ戻る。すなわち状態値は「0」か
ら変わらない。以降の入力文字「B」、「C」に関しても
同様であるため、入力された文字列ABCは無視される
のである。
【0071】文字列探索の処理フローを一般化すると図
1に示すようになる。図1において、符号100から符
号102で示す処理ブロックは、符号300から符号3
02で示す処理ブロックと同一である。「処理M+1」
(符号105)は、「処理NEC」、「処理NET」、「処理
NIMS」、「処理XYZ」に対応する。「処理N」は、「処理
10」に対応する。
1に示すようになる。図1において、符号100から符
号102で示す処理ブロックは、符号300から符号3
02で示す処理ブロックと同一である。「処理M+1」
(符号105)は、「処理NEC」、「処理NET」、「処理
NIMS」、「処理XYZ」に対応する。「処理N」は、「処理
10」に対応する。
【0072】なお、本実施形態においては、扱う文字を
ASCIIコード系のものとしたが、文字はこの体系のもの
に限定されるものではなく、JIS漢字、UNICODEな
ど、どのような体系の文字にも本発明を適用することが
できる。
ASCIIコード系のものとしたが、文字はこの体系のもの
に限定されるものではなく、JIS漢字、UNICODEな
ど、どのような体系の文字にも本発明を適用することが
できる。
【0073】また、本実施形態における文字列探索方
法、及び文字列探索用テーブル作成方法は、コンピュー
タが実行可能なプログラムにより実現され、これはコン
ピュータで読み取り可能な記録媒体に記録される。
法、及び文字列探索用テーブル作成方法は、コンピュー
タが実行可能なプログラムにより実現され、これはコン
ピュータで読み取り可能な記録媒体に記録される。
【0074】また、本実施形態における文字列探索用テ
ーブルはコンピュータで読み取り可能な記録媒体に記録
さる。この文字列探索用テーブルは、コンピュータが本
実施形態による作成方法のプログラムで作成し、記録媒
体に記録し、コンピュータが本実施形態による探索方法
のプログラムを実行する際に記録媒体より読み取り、使
用する。
ーブルはコンピュータで読み取り可能な記録媒体に記録
さる。この文字列探索用テーブルは、コンピュータが本
実施形態による作成方法のプログラムで作成し、記録媒
体に記録し、コンピュータが本実施形態による探索方法
のプログラムを実行する際に記録媒体より読み取り、使
用する。
【0075】
【発明の効果】以上説明したように本発明によれば、ハ
ッシュ探索方法と比較して高速に文字列の探索ができる
ことである。
ッシュ探索方法と比較して高速に文字列の探索ができる
ことである。
【0076】その理由は、本発明による文字列探索方法
は入力文字およびその時の状態値を文字列探索用テーブ
ルの配列の要素の位置情報として、状態要素値と文字要
素値で指定される位置にある要素内として格納されてい
る分岐先処理のアドレスを参照し分岐し、分岐先の処理
を繰り返すことで文字列の認識を行うため、CPU演算
の中で時間がかかる乗算や除算などの演算命令を使用し
ないためである。また入力された文字列は一回の探索に
よって、予約語かどうか判断できるため高速に文字列の
探索ができる。
は入力文字およびその時の状態値を文字列探索用テーブ
ルの配列の要素の位置情報として、状態要素値と文字要
素値で指定される位置にある要素内として格納されてい
る分岐先処理のアドレスを参照し分岐し、分岐先の処理
を繰り返すことで文字列の認識を行うため、CPU演算
の中で時間がかかる乗算や除算などの演算命令を使用し
ないためである。また入力された文字列は一回の探索に
よって、予約語かどうか判断できるため高速に文字列の
探索ができる。
【0077】ここで目安として、入力された文字列を整
数化して値Mの素数で割り、その余りを関数値とする簡
単な図10に示すハッシュ検索方法と本発明による文字
列探索方法を比較して、本発明による文字列探索方法が
どの位高速になるか述べる。
数化して値Mの素数で割り、その余りを関数値とする簡
単な図10に示すハッシュ検索方法と本発明による文字
列探索方法を比較して、本発明による文字列探索方法が
どの位高速になるか述べる。
【0078】NECのμPD70208CPUを例に取
ると、各演算に必要なクロック数は以下の通りである。
ると、各演算に必要なクロック数は以下の通りである。
【0079】 加算: 14クロック 減算: 14クロック 乗算: 39クロック 除算: 34クロック 比較: 16クロック 8ビット左シフト: 15クロック 分岐: 15クロック これらより、ハッシュ探索方法に必要なCPU時間と当
方法の探索方法に必要なCPU時間を比較すると以下の
ようになる。
方法の探索方法に必要なCPU時間を比較すると以下の
ようになる。
【0080】 ハッシュ探索方法におけるCPU時間=77クロック×文字数 (左8ビットシフト演算 15クロック×1回=15クロック) (加算 14クロック×2回=28クロック) (除算 34クロック×1回=34クロック) 本発明による探索方法におけるCPU時間=30クロック×文字数 (分岐 15クロック×2回=30クロック) よって本発明による探索方法を使用するとCPU時間が
およそ1/2に短縮され高速に文字列の探索を行うこと
が可能となる。また、ハッシュ関数が複数になり演算が
増えれば増えるほど両者の差が開く。
およそ1/2に短縮され高速に文字列の探索を行うこと
が可能となる。また、ハッシュ関数が複数になり演算が
増えれば増えるほど両者の差が開く。
【図1】本発明による文字列探索用テーブルを用いた文
字列探索方法のフローチャートである。
字列探索方法のフローチャートである。
【図2】本発明による文字列探索用テーブルを作成する
方法のフローチャートである。
方法のフローチャートである。
【図3】本発明の実施形態における文字列探索用テーブ
ルを用いた文字列探索方法のフローチャートである。
ルを用いた文字列探索方法のフローチャートである。
【図4】本発明の実施形態における予約語「NEC」を探
索するために必要になる文字列探索用テーブルのテーブ
ルサイズを示す図である。
索するために必要になる文字列探索用テーブルのテーブ
ルサイズを示す図である。
【図5】本発明の実施形態における予約語「NEC」を探
索するための文字列探索用テーブルを示す図である。
索するための文字列探索用テーブルを示す図である。
【図6】本発明の実施形態における予約語「NEC」及び
「NET」を探索するための文字列探索用テーブルを示す
図である。
「NET」を探索するための文字列探索用テーブルを示す
図である。
【図7】本発明の実施形態における予約語「NEC」、「N
ET」及び「NIMS」を探索するための文字列探索用テーブ
ルを示す図である。
ET」及び「NIMS」を探索するための文字列探索用テーブ
ルを示す図である。
【図8】本発明の実施形態における予約語「NEC」、「N
ET」、「NIMS」及び「XYZ」を探索するための文字列探
索用テーブルを示す図である。
ET」、「NIMS」及び「XYZ」を探索するための文字列探
索用テーブルを示す図である。
【図9】ハッシュ探索方法におけるハッシュ表作成方法
のフローチャートである。
のフローチャートである。
【図10】ハッシュ関数内部の処理フローチャートであ
る。
る。
【図11】ハッシュ探索方法のフローチャートである。
100 初期化 101 読み出し処理部 102 ジャンプ 103 処理0 104 処理1 105 処理M+1 106 処理N
Claims (5)
- 【請求項1】 入力されうる全ての文字種類を行とし、
文字列探索処理状態を示す状態値種類を列とする2次元
配列構造のテーブルであり、各配列要素に、予め全ての
予約語の探索処理状態に応じて決められた状態値を変更
する処理手順へ分岐する分岐先アドレス、もしくは前記
予約語が探索された場合の処理手順へ分岐する分岐先ア
ドレスが格納されている文字列探索用テーブルを用い
て、入力された文字列が予め定められた予約語であるか
どうか探索する文字列探索方法において、 状態値を0に初期化する第1の手順と、 一文字ずつ入力文字を得る第2の手順と、 前記得られた入力文字を行、状態値を列として前記文字
列探索用テーブルを参照し、要素内に格納されているア
ドレスに分岐する第3の手順と、 分岐アドレスに従い、状態値の変更処理もしくは予約語
一致処理を実行し、再び第2の手順に戻る第4の手順と
を有することを特徴とする文字列探索方法。 - 【請求項2】 入力されうる全ての文字種類を行とし、
文字列探索処理状態を示す状態値種類を列とする2次元
配列構造のテーブルであり、各配列要素に、予め全ての
予約語の探索処理状態に応じて決められた状態値を変更
する処理手順へ分岐する分岐先アドレス、もしくは前記
予約語が探索された場合の処理手順へ分岐する分岐先ア
ドレスが格納されている文字列探索用テーブルを作成す
る文字列探索用テーブル作成方法において、 入力されうる全ての文字種類を前記文字列探索用テーブ
ルの行方向の大きさとする第1の手順と、 文字列探索状況の初期値を示す状態値「0」と状態値を
「0」に変更する処理部「処理0」を用意する第2の手
順と、 前記文字列探索用テーブルに登録する全ての予約語をソ
ートする第3の手順と、 前記ソートされた全ての予約語から第1の予約語「予約
語1」を取り出し、「予約語1」を構成する1文字目か
らn文字目(nは予約語1の文字列長)までを各々状態
値「1」から状態値「n」として用意する第4の手順
と、 状態値「0」から状態値「n」までを前記文字列探索用
テーブルの列方向の大きさとする第5の手順と、 状態値を「1」に変更する処理部「処理1」から、状態
値を「n」に変更する処理部「処理n」までのn個の処
理部を用意する第6の手順と、 予約語「予約語1」を探索した場合の処理「処理予約語
1」を用意する第7の手順と、 前記文字列探索用テーブルにおいて、「予約語1」の1
文字目からn文字目までの各文字を行、状態値「0」か
ら状態値「n−1」までを列とする各々の要素内に「処
理1」から「処理n」への分岐アドレスを格納する第8
の手順と、 前記文字列探索用テーブルにおいて、デリミタ文字を
行、状態値「n」を列とする要素内に処理「処理予約語
1」へのアドレスを格納する第9の手順と、 前記ソート後の次の予約語「予約語m」を取り出し「予
約語m」の構成文字数Aを求める第10の手順と、 予約語「予約語m」と予約語「予約語m−1」を比較し
両予約語の1文字目からn文字目まで連続した同じ文字
の数Bを求める第11の手順と、 A−Bの分だけ新規に状態値「n+1」から状態値「n
+A−B」までを用意する第12の手順と、 改めて状態値「0」から状態値「n+A−B」までを前
記文字列検索用テーブルの列方向の大きさとする第13
の手順と、 状態値を「n+1」に変更する処理部「処理n+1」か
ら、状態値を「n+A−B」に変更する処理部「処理n
+A−B」までA−B個の処理部を各々用意する第14
の手順と、 予約語「予約語m」を探索した場合の処理「処理予約語
m」を用意する第15の手順と、 前記文字列探索用テーブルにおいて、前記「予約語m」
のB+1文字目を行、状態値「B」を列とする要素内に
処理部「処理n+1」への分岐アドレスを格納する第1
6の手順と、 前記文字列探索用テーブルにおいて、前記「予約語m」
のB+2文字目からA文字目までの各文字を行、前記状
態値「n+1 」から「n+A−B−1」を列とする各々
の要素内に「処理n+2」から処理「n+A−B」への
分岐アドレスを格納する第17の手順と、 前記文字列探索用テーブルにおいて、デリミタ文字を
行、状態値「n+A−B」を列とする要素内に処理「処
理予約語m」へのアドレスを格納する第18の手順と、 状態値「n」に状態値「n+A−B」を代入する第19
の手順と、 前記ソートした残りの全ての予約語について、第10の
手順から第19の手順まで繰り返し、全ての予約語の登
録が終わった後、前記文字列探索用テーブルの要素内の
うち、何も格納していない要素内に処理部「処理0」へ
の分岐アドレスを格納する第20の手順とを有すること
を特徴とする文字列探索用テーブル作成方法。 - 【請求項3】 請求項1に記載の文字列探索方法をコン
ピュータに実行させるためのプログラムを記録したこと
を特徴とする記録媒体。 - 【請求項4】 請求項2に記載の文字列探索用テーブル
作成方法をコンピュータに実行させるためのプログラム
を記録したことを特徴とする記録媒体。 - 【請求項5】 入力された文字列が予め定められた予約
語であるかどうか探索する文字列探索方法で用いる文字
列探索用テーブルを記録した記録媒体において、 入力されうる全ての文字種類を行とし、文字列探索処理
状態を示す状態値種類を列とする2次元配列構造のテー
ブルであり、 各配列要素に、予め全ての予約語の探索処理状態に応じ
て決められた状態値を変更する処理手順へ分岐する分岐
先アドレス、もしくは前記予約語が探索された場合の処
理手順へ分岐する分岐先アドレスが格納されている文字
列探索用テーブルを記録したことを特徴とする記録媒
体。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP9163913A JP3062119B2 (ja) | 1997-06-20 | 1997-06-20 | 文字列探索用テーブル、その作成方法及び文字列探索方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP9163913A JP3062119B2 (ja) | 1997-06-20 | 1997-06-20 | 文字列探索用テーブル、その作成方法及び文字列探索方法 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| JPH1115836A true JPH1115836A (ja) | 1999-01-22 |
| JP3062119B2 JP3062119B2 (ja) | 2000-07-10 |
Family
ID=15783215
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP9163913A Expired - Lifetime JP3062119B2 (ja) | 1997-06-20 | 1997-06-20 | 文字列探索用テーブル、その作成方法及び文字列探索方法 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JP3062119B2 (ja) |
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2006505043A (ja) * | 2002-10-29 | 2006-02-09 | ロッキード・マーチン・コーポレイション | ハードウェアパーサアクセラレータ |
| JP2009104606A (ja) * | 1999-04-09 | 2009-05-14 | Internatl Business Mach Corp <Ibm> | 望ましくない電子メッセージの送信または受信を妨害するための方法 |
| CN112395830A (zh) * | 2019-07-31 | 2021-02-23 | 腾讯科技(深圳)有限公司 | 一种基于万国码的表格处理方法以及相关装置 |
-
1997
- 1997-06-20 JP JP9163913A patent/JP3062119B2/ja not_active Expired - Lifetime
Cited By (3)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2009104606A (ja) * | 1999-04-09 | 2009-05-14 | Internatl Business Mach Corp <Ibm> | 望ましくない電子メッセージの送信または受信を妨害するための方法 |
| JP2006505043A (ja) * | 2002-10-29 | 2006-02-09 | ロッキード・マーチン・コーポレイション | ハードウェアパーサアクセラレータ |
| CN112395830A (zh) * | 2019-07-31 | 2021-02-23 | 腾讯科技(深圳)有限公司 | 一种基于万国码的表格处理方法以及相关装置 |
Also Published As
| Publication number | Publication date |
|---|---|
| JP3062119B2 (ja) | 2000-07-10 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US10169425B2 (en) | Fast identification of complex strings in a data stream | |
| US8645350B2 (en) | Dictionary compilations | |
| EP0702310B1 (en) | Data retrieval system, data processing system, data retrieval method, and data processing method | |
| Boucher et al. | Computing the original eBWT faster, simpler, and with less memory | |
| Li et al. | Optimal in-place suffix sorting | |
| JPH06222903A (ja) | 文字データを圧縮し圧縮済みデータを展開するための静的辞書構造を提供する方法および手段 | |
| JPH07297728A (ja) | パターン一致を探索するための方法およびシステム | |
| CN114880523B (zh) | 字符串处理方法、装置、电子设备及存储介质 | |
| JPH08180069A (ja) | 単語辞書検索装置 | |
| CN113076733A (zh) | 一种文本匹配方法、终端设备及存储介质 | |
| JP3062119B2 (ja) | 文字列探索用テーブル、その作成方法及び文字列探索方法 | |
| US20120284279A1 (en) | Code string search apparatus, search method, and program | |
| CN108197470A (zh) | 快速特征码扫描 | |
| JP3284064B2 (ja) | デジタル探索装置 | |
| JP2001306614A (ja) | 文字列検索方法およびその方法を用いた文字列検索装置 | |
| JPH0652222A (ja) | 情報検索処理装置 | |
| JP2001117929A (ja) | データ検索方法、データ整列方法およびデータ検索装置 | |
| Martin et al. | Faster exact distributions of pattern statistics through sequential elimination of states | |
| JP2535655B2 (ja) | 辞書検索方式 | |
| US20030187843A1 (en) | Method and system for searching for a list of values matching a user defined search expression | |
| JP3722231B2 (ja) | コンパクトにエンコードされて記憶されたストリングの組を有する製品 | |
| CA2855398C (en) | Fast identification of complex strings in a data stream | |
| JP3018579B2 (ja) | 名前検索処理装置 | |
| CA2873000C (en) | Fast identification of complex strings in a data stream | |
| McInnes | TRANSLATOR GENERATOR SYSTEM. Report No. 237. |