(57)【特許請求の範囲】
【請求項１】
文字のストリングでストリング組データをサーチする方法において、上記ストリング組データは１組のストリングを指示するものであり、上記ストリング組データは、第１データ項目を含むデータ項目のシーケンスを備えており、上記第１データ項目は、１組の文字形式のうちの少なくとも１つを指示する第１項目のラベル情報と、第１項目のサーチ情報とを含み、該第１項目のサーチ情報は、上記第１データ項目が次のデータ項目を有しているかどうかを指示する第１項目の次の情報と、上記第１データ項目が別のデータ項目を有しているかどうかを指示する第１項目の別の情報とを含んでおり、上記方法は、
上記第１データ項目にアクセスし、
上記ストリングにおける現在文字が上記第１項目のラベル情報に一致しそして上記第１項目の次の情報が、上記第１データ項目が次のデータ項目を有していると指示する場合に、上記第１データ項目のシーケンスにおける位置に基づいて次のデータ項目にアクセスし、そして
上記ストリングにおける現在文字が上記第１項目のラベル情報に一致せずそして上記第１項目の別の情報が、上記第１データ項目が別のデータ項目を有していると指示する場合に、上記第１データ項目のシーケンスにおける位置に基づいて別のデータ項目にアクセスするという段階を備えたことを特徴とする方法。
【請求項２】
メモリと、メモリにアクセスするように接続されたプロセッサと、メモリに記憶されたストリングデータとを有するマシンを動作させる方法であって、
前記ストリングデータが、エレメントストリングの組を指示しており、前記ストリングデータが、メモリに記憶された複数のデータユニットから成り、それによって、前記プロセッサが前記記憶されたデータユニットにアクセスしてその記憶されたデータユニットをエレメントストリングについてサーチできるようにし、
前記記憶されたデータユニットが、一連の複数のサブシーケンスのデータユニットから成り、各サブシーケンスが、ラベルの組の少なくとも１つを指示するサブシーケンスラベル情報と、記憶されたデータユニットをエレメントストリングについてサーチする際にプロセッサによって使用するためのサブシーケンスサーチ情報を有し、各エレメントがラベルの組の一つのインスタンスであり、
各サブシーケンスのサブシーケンスサーチ情報が、
ストリングの現在エレメントがサブシーケンスラベル情報により指示されたラベルのインスタンスである場合に、サブシーケンスがプロセッサが進むデータユニットの次のサブシーケンスを有すること、又は、サブシーケンスが次のサブシーケンスを有しないことのいずれかを指示するサブシーケンスの次の情報と、
ストリングの現在エレメントがサブシーケンスラベル情報により指示されたラベルのインスタンスでない場合に、サブシーケンスがプロセッサが進むデータユニットの別のサブシーケンスを有すること、又は、サブシーケンスが別のサブシーケンスを有しないことのいずれかを指示するサブシーケンスの別の情報と、
を含み、
前記記憶されたデータユニットは、一連のサブシーケンスが位置決めされるようにメモリに順序付けられ、このサブシーケンスの位置決めは、プロセッサがサブシーケンスの最初の１つにアクセスし、最初のサブシーケンスがデータユニットの次のサブシーケンスを有することを最初のサブシーケンスの次の情報が指示する場合に、直後に続くサブシーケンスに進むことにより次のサブシーケンスにアクセスし、前記直後に続くサブシーケンスは、最初のサブシーケンスの次のサブシーケンスであり、また、プロセッサが最初のサブシーケンスにアクセスし、最初のサブシーケンスがデータユニットの別のサブシーケンスを有することを最初のサブシーケンスの別の情報が指示する場合に、最初のサブシーケンスとその別のサブシーケンスとの間のサブシーケンスにおけるサブシーケンスの次の情報とサブシーケンスの別の情報とだけを使用して別のサブシーケンスにアクセスするように、行われる、
ような方法において、
プロセッサを動作させてエレメントストリングを指示するデータを得る段階と、
プロセッサを動作させてストリングデータをサーチしてエレメントストリングがストリング組の一つであるかどうかを決定する段階と、
を有し、
プロセッサを動作させてストリングデータをサーチする段階が、
一連のサブシーケンスにおいて最初のデータユニットのサブシーケンスにアクセスし、エレメントストリングのうちの現在のエレメントが最初のサブシーケンスのラベル情報により指示されたラベルのインスタンスであるかどうかを決定する段階と、
現在のエレメントが前記指示されたラベルのインスタンスであり、且つ、最初のサブシーケンスがデータユニットの次のサブシーケンスを有することを最初のサブシーケンスの次の情報が指示する場合に、直後に続くサブシーケンスに進むことにより次のサブシーケンスにアクセスする段階と、
現在のエレメントが前記指示されたラベルのインスタンスでなく、且つ、最初のサブシーケンスがデータユニットの別のサブシーケンスを有することを最初のサブシーケンスの別の情報が指示する場合に、最初のサブシーケンスとその別のサブシーケンスとの間のサブシーケンスにおけるサブシーケンスの次の情報とサブシーケンスの別の情報とだけを使用して別のサブシーケンスにアクセスする段階と、
を有することを特徴とする方法。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、コンパクトにエンコードされた形態で記憶されたデータに係る。
【０００２】
【従来の技術】
１９９３年１月の「ソフトウェアプラクティス・アンド・エクスペアリアンス(Software-Practice and Experience)」第２３（１）巻、第１５ないし３０ページに掲載されたルチェシＣ．Ｌ．及びコワルトフスキーＴ．著の「多数の用語を表す有限オートマトンの応用(Applications of Finite Automata Representing Large Vocabularies) 」には、効率的なスペルチェッカを実施するという問題が動機となって、非常に多数の用語集を最小の非繰り返し確定有限オートマトンに圧縮するための技術が開示されている。図４は、幾つかの英語の動詞の全ての形態に対するオートマトンを示している。オートマトンを形成する技術は１８ページの始めに記載されており、この技術は最小化の段階を含む。データ構造は、１９ないし２０ページに記載されており、各状態は、アルファベットのサイズをＮとすれば、Ｎ個のエントリーを有するアレイとして表される。ほとんどのエントリーは非存在の遷移に対応しており、従って、状態アレイは、存在するエントリーが衝突しないようにシフトしそしてオーバーラップすることができる。各状態には、その状態に対して存在する遷移を選択する１つのＮビットベクトルが添付される。アレイのパッキングはグリーディアルゴリズムによって行われ、該アルゴリズムは、１つ、２つ又は３つの遷移をもつ状態の割合が非常に大きいためにほぼ何時でも最適な結果を与える。又、個別ビットベクトルの数は状態の数より相当に小さいので、多数が共有される。状態アレイをパッキングする他に、短い（相対的）及び長い（絶対的）状態指示子が使用される。ポルトガル語の場合には、文字がその区分発音符から剥がされ、その位置がワード終止符の後にエンコードされる。
【０００３】
【発明の構成】
本発明は、ワードや数字のような１組のストリング、及び他のストリングを定めるデータをコンパクトに記憶するという問題を軽減するものであり、上記他のストリングは、アルファベット的、発音的、署名的又は象形的エレメント；番号のような数字エレメント；句読点符号；区分発音符；数学及び論理記号；及び言語の筆記又は印刷形態で見かけることのある他の個別のエレメントを含み、これらは全てここでは「文字」と称する。本発明は、１組のストリングを表すのに必要なデータの量を減少する多数の関連技術の発見に基づくものである。
【０００４】
第１の技術は、データの項目の順序を使用し、さもなくば追加データを必要とするであろうある情報を保持するものである。１組のストリングの情報は、文字の識別に関する情報と、１つの文字ストリングでその１組のストリングをいかにサーチするかに関する情報とを含む種々の形式の情報を含むことができる。この第１の技術は、いかにサーチするかを指示するに必要なデータを減少するデータ順序付け技術である。
【０００５】
このデータ順序付け技術は、データの項目をシーケンス内に位置付ける。シーケンス内の第１のデータ項目は、ラベル情報とサーチ情報とを含んでいる。ラベル情報は、１組の文字形式のうちの１つ、例えば、アルファベットの文字の形式を指示することができる。サーチ情報は、次の情報及び別の情報を含む。
【０００６】
次の情報とは、ストリングの現在文字がラベル情報に一致する場合に第１のデータ項目がサーチを続けることのできる次のデータ項目を有するかどうかを指示するものである。次のデータ項目は、第１のデータ項目のシーケンス内の位置に基づいてアクセスすることができる。
【０００７】
別の情報とは、ストリングの現在文字がラベル情報に一致しない場合に第１のデータ項目がサーチを続けることのできる別のデータ項目を有するかどうかを指示するものである。別のデータ項目は、第１のデータ項目のシーケンス内の位置に基づいてアクセスすることができる。
【０００８】
データ順序付け技術は、次のデータ項目を有する各データ項目の直後に該次のデータ項目が続くようにデータ項目を配置することによって実施することができる。又、データ項目が次のデータ項目を有していないが別のデータ項目を有している場合には、該別のデータ項目がデータ項目の直後に続く。更に、データ項目が次のデータ項目も別のデータ項目も有していない場合には、その直後に続くことができるのは、次のデータ項目及び別のデータ項目の両方を有するシーケンス内の手前の最も近いデータ項目に対する別のデータ項目である。
【０００９】
この順序付けの結果、データ項目の次の及び別のデータ項目の位置を指示するためのポインタ又は他の付加的なデータが不要となる。これは、ストリングの組を表すのに必要なデータを著しく減少することができる。
【００１０】
１つの文字ストリングでシーケンスをサーチするために、そのシーケンス内のデータの項目のラベル情報に対してそのストリングの文字を一致させることができる。文字が一致しそしてデータの項目が次のデータ項目を有する場合には、サーチはその直後のデータ項目へと進み、ストリングの次の文字を一致させようと試みる。その文字が一致せずそしてデータの項目が別のデータ項目を有している場合には、サーチはその別のものへと進み、これは、次の項目をもたない項目が別の項目をもつ項目と同数に到達するまでデータ項目を通して進むことによって行うことができ、その到達直後のデータ項目が、シークされた別の項目となる。文字が一致せずそしてデータ項目が別の項目をもたない場合には、そのストリングがその組にはないことになる。同様に、ストリングの最後の文字が、その組のストリングの最終文字ではないデータの項目によって一致された場合にも、そのストリングがその組にはないことになる。
【００１１】
第２の技術は、データの項目をコンパクトにエンコードすることにより第１の技術の上に構築される。データがＮビットの単位で取り扱われるシステムにおいては、データの各項目を単一のＮビット単位でエンコードすることができる。更に、データのある項目は、２つのＮビット単位でエンコードするのが効果的である。
【００１２】
例えば、各データ項目は、上記したラベル情報、次の情報、及び別の情報と、一致されつつある文字のストリングが、その最後の文字がラベル情報に一致する場合に１組のストリング内にあるかどうかを指示する最終情報とを含むことができる。この場合に、最終情報、次の情報及び別の情報について６つの組み合わせが考えられる。即ち、最終情報＋次の情報＋別の情報；最終情報＋次の情報＋別の情報なし；最終情報＋次の情報なし＋別の情報；最終情報＋次の情報なし＋別の情報なし；最終情報なし＋次の情報＋別の情報；及び最終情報なし＋次の情報＋別の情報なし、である。
【００１３】
それ故、Ｎビットの単位でのエンコードは、アルファベット文字のようなラベルの数をＬとすれば、２N ≧６Ｌの場合に可能となる。８ビットバイトの場合には、Ｎ＝８であり、従って、４２個の異なったラベル（即ち、２５６を６で除算した商）をもつデータの項目をこのようにエンコードすることができる。
【００１４】
或いは又、データ項目が次の項目をもたないことを特殊なバイト値で指示することができ、各データ項目をそれが次の項目をもつ場合は１バイトでエンコードしそして次の項目をもたない場合は２バイトでエンコードすることができる。この場合に、第１バイトにおける最終情報と別の情報との組み合わせは４つしか考えられない。即ち、最終情報＋別の情報；最終情報＋別の情報なし；最終情報なし＋別の情報；及び最終情報なし＋別の情報なし、である。それ故、最終情報と別の情報の各々は、各バイトのうちの１ビットを使用することができる。８ビットバイトの場合には、６４個の異なるラベル（即ち、２５６を６で除算した商）をもつデータの項目をこのようにエンコードすることができる。
【００１５】
又、第３の技術も、ポインタで冗長度を減少することによって第１及び第２の技術の上に構築される。ストリングの組全体がデータ項目のシーケンスで表される場合には、そのシーケンスの一部分は同じであってもよい。例えば、英語においては、文字「ｉｎｇ」は多くのストリングの終わりに生じ、これらのストリングの終わりを表すシーケンスの部分は同じであってもよい。この場合に、その同じ部分を一度しか含まず、それが生じるシーケンス内の他の位置の各々にはそれに対するポインタをもたせることにより、シーケンスの長さを減少することができる。
【００１６】
この技術は、データの項目をエンコードするのに使用されないバイト値を用いて実施することができる。１バイトエンコードの場合に、２N ＞６Ｌであれば、（２N −６Ｌ）バイト値がポインタとして使用できる。特殊な非次バイトでエンコードする場合には、ポインタとして使用できるバイト値の数は（２N −４Ｌ）であり、２Ｌだけ多数のポインタとなる。
【００１７】
しかしながら、有用なサイズのストリングの組の場合に、１バイトポインタではシーケンス内の独特の位置を指示するに充分な情報が与えられない。というのは、シーケンスは２５６個以上の位置を含んでいるからである。それ故、ポインタとして得られるバイト値の各々を使用して、シーケンス内の独特の位置を指示する２バイト以上の全長ポインタを得るための追加データをアクセスすることができる。これらバイト値の１つは、例えば、全長ポインタを得るために使用されるその直後に続くバイトの数を指示することができる。或いは又、バイト値は、全長ポインタを含むルックアップテーブル内のエントリーを指示することができる。
【００１８】
この技術は、データが記憶される記憶媒体を含む製品において実現することができる。記憶されたデータは、１組のストリングを指示するストリング組データを含んでいる。このストリング組データは、複数のデータ項目を含んでいる。ある項目は、ラベル情報と、次の情報と、別の情報とを含み、そしてこれらの項目は、上記したように、データ項目の位置に基づいてマシンのサーチで項目の次のデータ項目及び別のデータ項目に到達できるように順序付けされる。データの各項目は、上記した方法の１つでエンコードすることができる。これら項目はシーケンス内において順序付けすることができ、そしてシーケンスは冗長度を減少するためにポインタを含むことができる。又、記憶されたデータは、短い長さのポインタでアクセスして全長ポインタを得られるようにするエントリーを有したルックアップテーブルも含むことができる。
【００１９】
上記製品は、記憶されたデータをアクセスするように接続されたプロセッサを含むことができる。記憶されたデータは、ストリングが上記組のストリングの１つであるかどうかを決定するためにプロセッサが実行することのできる命令も含むことができる。
【００２０】
上記した技術は、ストリングの組を表すのに必要なデータ量を減少するので効果的である。更に、この技術は、ストリングがストリングの組の中にあるかどうかを判断するように迅速にサーチすることができる。
【００２１】
【実施例】
Ａ．エンコードしたデータ
１組のストリングを指示するデータを有する製品は多数の方法で製造することができる。図１ないし４は、コンパクトにエンコードしたデータを形成する基本的なエンコード技術を示している。
【００２２】
図１は、簡単な有限状態マシン（ＦＳＭ）データ構造体の一部分をグラフ形態で示しており、各状態は円として示されそして状態間の遷移は矢印付きの線として示されている。状態６０はスタート状態と称し、状態６２、６６、７０及び７２は全て最終状態で、円内に文字「Ｆ」で示されており、これは、データ構造体によってカバーされたストリングの１つがこれら状態の各々において終了することを意味している。図１のデータ構造体は、最終と表示された状態に最終的に至るような遷移のみを含んでいるが、最終的にこのような最終状態に至らない遷移は省略されていることに注意されたい。更に、文字は、文字ＡないしＥで表されており、従って、これらの文字は、結局は最終状態に至る状態間の遷移のラベルとして働く。状態６２は、最終状態がデータ構造体の分岐路の終わりに来る必要がなく、データ構造体内の任意の状態にあってもよいことを示している。
【００２３】
図２は、図１のデータ構造体を遷移ユニットにエンコードする一例を示している。エンコードされたデータ構造体の情報はアルファニューメリック文字として示されているが、これは典型的に２進形態でメモリに記憶される。メモリアドレスは左のカラムに示されており、その後のカラムは各アドレスにおけるラベルフィールドを示している。ラベルフィールドの後に、各アドレスにはポインタのための２つのフィールドがあり、その１つは、ラベルが受け取った文字に対応する場合に続く遷移ユニットに対するものであり、そしてもう１つは、それに続く別の出力遷移ユニット（もしあれば）に対するものである。各遷移ユニットは、図示されたように、多数のビットフィールドも備えており、これらは、対応する遷移又は到達する状態に関する情報を与えるものである。
【００２４】
図２の情報は図１のＦＳＭデータ構造体に単純に対応する。遷移ユニットは、例えば、アドレス１において、状態６０と６２との間の遷移に対応し、それ故、そのラベルフィールドに文字Ａを有している。その後続ポインタフィールドは、状態６２の第１出力遷移ユニットのアドレスを含んでおり、これは状態６４への遷移に対応する。受け取った文字がアドレス１のラベルＡに対応する場合には、アドレス２の遷移ユニットが、次に受け取る文字との比較のためにアクセスされる。状態６０は出力遷移が１つしかないので、別の出力遷移ユニットはなく、従って、アドレス１の別のポインタフィールドはポインタを含まず、別のビットは０にセットされる。図１に示すように、状態６２は最終状態であり、従って、アドレス１の最終ビットは１にセットされる。状態６２は２つの出力遷移を有しているので、データ構造体の分岐路の終わりではなく、アドレス１の分岐終了（ＥＯＢ）ビットも０にセットされる。同様に、アドレス２の遷移ユニットは状態６２と６４との間の遷移に対応し、アドレス３は状態６４と６６との間の遷移に対応し、アドレス４は状態６２と６８との間の遷移に対応し、アドレス５は状態６８と７０との間の遷移に対応し、そしてアドレス６は状態６８と７２との間の遷移に対応する。
【００２５】
図２の情報は、図１の遷移に関する情報を含むだけでなく、状態及び状態と遷移の関係に関する情報も含んでいる。図１の各遷移に関する情報は、当然そのラベルを含んでおり、そして各状態に関する情報は、それが最終的なものであるかどうかの指示を含む。ラベルは、遷移に対応する各遷移ユニットのラベルフィールドにエンコードされ、そして最終ビットは、最終状態へと至る遷移の１つに対応する各遷移ユニットにおいてエンコードされ、従って、これら情報項目は遷移ユニットにおいて完全にエンコードされる。同様に、状態と遷移との関係に関する全ての情報もエンコードされるが、これはあまり単純ではない。ある状態に至る遷移の組は、後続ポインタフィールドがその状態からの第１出力遷移のアドレスを有しているような遷移ユニットを探すことによって見つけることができる。ある状態を去る遷移の組は、その状態に至る遷移ユニットのいずれかから簡単に見つけることができ、そして入力遷移ユニット各々の後続ポインタフィールドにアドレスを有する第１出力遷移ユニットと、該第１出力遷移ユニット又は１つの他の別の遷移ユニットの別のポインタフィールドに各アドレスをもつ別の遷移ユニットとを備えている。
【００２６】
図２の情報についての上記分析から、別のビット及びＥＯＢビットが冗長であることが明らかであろう。別のビットは別のポインタがあるときだけ１にセットされ、一方、ＥＯＢビットは後続ポインタがないときだけ１にセットされる。これは、これらのビットを除去できることを示唆する。図３はこれらビットが保持された同じデータ構造体をエンコードしたものであるが、後続ポインタ及び別のポインタが除去されており、別のビット及びＥＯＢビットが除去される場合よりもエンコードデータ構造体に必要なスペースが大巾に減少されている。このコンパクト化は部分的に可能である。というのは、遷移ユニットがサブシーケンスに順序付けされて、各状態からの第１出力遷移ユニットがその状態に至る遷移ユニットの１つの直後に続くようにされるからである。又、遷移ユニットは、各その後の別の出力遷移ユニットが同じ状態からの手前の出力遷移ユニットから従属する遷移ユニットの直後に続くように順序付けされる。
【００２７】
図３において、遷移ユニットのサブシーケンスの１つはアドレス１ないし３を含み、その全てが第１の出力遷移ユニットを含んでいる。別のサブシーケンスはアドレス４及び５を含み、アドレス４の遷移ユニットは、第１出力遷移ユニットがアドレス５にあるような状態へ通じる。換言すれば、図１のＦＳＭデータ構造体の第１出力遷移ユニットの各々は、それに通じる遷移ユニットの直後に続くようにエンコードされる。それ故、受け取った文字が遷移ユニットからのラベルに対応する場合には、それにより生じる状態から第１出力遷移ユニットを探すのに後続ポインタは必要なく、アクセスされているメモリアドレスを増加するだけで簡単に見つけることができる。
【００２８】
同様に、図３の遷移ユニットは、アドレス４及び６のその後の別の出力遷移ユニット各々がアドレス２及び５の手前の出力遷移ユニットから各々従属する遷移ユニットの直後に続くように順序付けされる。別のビットを有する遷移ユニットから従属してそれを含む各組の遷移ユニット内で、最後の遷移ユニットは、遭遇したＥＯＢビットの全数が遭遇した別のビットの数に等しくなる唯一のユニットである。従って、アドレス３のＥＯＢビットは、アドレス２の別のビットと対にされそしてそれに対してバランスされ、一方、アドレス５のＥＯＢビット及び別のビットは互いにバランスする。各々の場合に、その後の別の出力遷移ユニットは、アドレスを経て進めていって、別のビット及びＥＯＢビットを追跡し、そしてこれら別のビット及びＥＯＢビットがバランスしたときに次のアドレスへ増加することにより見つけることができる。ここでも、別のポインタは必要ない。
【００２９】
図２及び３に示すエンコードは各々図１の全ＦＳＭデータ構造体を含むが、ＦＳＭデータ構造体のいずれかの適当な部分にエンコード技術を適用することができる。更に、以下で明らかとなるように、エンコードされたデータ構造体にポインタを保持して、適宜、そのサイズを減少するか、又は受け取ったストリングとの比較の速度を高めることができる。又、以下で詳細に述べるように、図３の各遷移ユニットの情報は、更に圧縮することができる。というのは、主として、欠陥状態をもたないＦＳＭデータ構造体の場合に、ＥＯＢビットが１であるときに最終ビットが０になり得ないからである。又、このような更なる圧縮は、１より大きい長さのポインタデータユニットを効率的に使用できるようにする。
【００３０】
エンコードされたＦＳＭデータ構造体は、典型的に、８ビット長さのバイトを有するメモリに記憶される。図４は、８ビットバイトがとる全部で２５６の値のバイトマップの一例であり、ラベル及び追加情報を含む値と、ポインタデータユニットに割り当てられた値との両方を含んでいる。
【００３１】
ポインタデータユニットに割り当てられるバイト値は、説明上、ポインタデータユニットの３つの形式の第１バイトに対応する３つのブロックに分割され、これらは、各々、短い長さ及び中間長さのポインタインデックス並びに全長ポインタであって、例えば、１、２及び３バイト長さである。短い長さ又は中間長さの各ポインタインデックスは、実際には、アクセスされるべき遷移ユニットに対する全長ポインタが記憶されたテーブルエントリーをアクセスするのに使用されるオフセットであり、一方、各全長ポインタはポインタそれ自体を形成するものであって、もし必要であれば、使用される全ての位置をアドレスするために３バイトより大きな長さであってもよい。相当な数の短い長さのポインタインデックスを与えるために、ポインタデータユニットバイト値のほとんどがそれらに割り当てられるのが好ましい。図示された例では、８つのバイト値を除く全てが短いポインタインデックスに割り当てられ、これら残りの８つのうちの６つは中間長さポインタインデックスの第１バイトに割り当てられ、そして２つは全長ポインタの第１バイトに割り当てられる。しかしながら、この構成はある程度任意のものであり、バイト値の別の分割も適当である。図４において、バイト値の第１ブロックは、短い長さのポインタインデックスに割り当てられ、次の６つのバイト値は、中間サイズ即ち中間長さのポインタインデックスに割り当てられ、そして最後の２つのバイト値は、長いポインタ即ち全長ポインタに割り当てられる。
【００３２】
図４は、ラベルがＮ個の個別の値のいずれか１つをとり、そして英語のアルファベット文字の場合に、Ｎが２６より大きな整数であって、ハイフンやアポストロフィーのような文字も含むことができることを仮定している。このような余分な文字の各々は、通常のアルファベット文字に組み合わせて単一の逃避文字としてエンコードすることができる。これは、Ｎを小さく保持し、より多くのバイト値をポインタデータユニットとして使用するように残す。最終ビット、別のビット及びＥＯＢビットの６つの考えられる組み合わせの各々に対し、Ｎ個の値のブロックは図示されたように割り当てられる。図４のバイトマップにおいて、各ブロックに１の値を有するビットはそのブロックに示されているが、図４におけるブロックの特定の構成はある程度任意であり、ブロックは多数の他の構成で順序付けすることもできる。
【００３３】
上記したように、最終ビットが０であり且つＥＯＢビットが１である２つの組み合わせは、ＦＳＭデータ構造体が欠陥状態を含まない限り生じることはなく、従って、ビット値の８つの考えられる組み合わせの中から６つだけを使用することは、欠陥状態のないデータ構造体をもつことに依存している。実際に、受け取ったストリングがデータ構造体内の一連の遷移（その最後の遷移が最終ビット１である）によって一致できないときに、欠陥状態に到達する。
【００３４】
テーブル１は、バイト値のスペースを割り当てることのできる別の方法を示している。テーブル１は、８ビットバイト値を０から２５５までの範囲内で図４に示されたものと同様に割り当てる。Ｎは以下で詳細に述べる個別ラベルの数であり、Ｐ1 は長いポインタバイトコードの数であり、そしてＰ2 は中間サイズのポインタバイトコードの数である。テーブル１から明らかなように、短いポインタバイトコードの数は、２５５−（４Ｎ＋Ｐ1 ＋Ｐ2 ）である。
0003722231.tif 000002
0003722231.tif 000003
【００３５】
図４のバイト値割り当てはテーブル１とは多数の点で異なる。図４では、バイト値のブロックが６つの異なる形式の文字に割り当てられ、各形式は、「最終」と、「別」と、分岐路の終わりを意味するＥＯＢとのある組み合わせである。しかしながら、テーブル１では、特殊なＥＯＢバイトに値０が割り当てられ、このバイトは、分岐路の終わりを表すいかなるバイトにも続くことができる。このバイトが短いポインタバイトとして処理される場合には、最終でなく且つそれ自身へ循環して戻るサブシーケンスを開始するデータユニットを指すことができ、ＥＯＢバイトの後に最終データユニットに到達することがないよう確保できる。
【００３６】
このＥＯＢバイトの結果、各文字は、４つの異なる形式、即ち、「最終」（受け入れられるとも称する）及び「別」（ａｌｔとも称する）の４つの考えられる文字の組み合わせしかもたない。４つの形式の文字しかもたないことは効果的である。というのは、各文字の形式を、比較のためにマスクできる２つのビットで表すことができ、テーブルルックアップや他の複雑なバイト値のデコードを行う必要がないからである。それ故、図４のようにブロックを割り当てるのではなくて、テーブル１は、４つの連続するバイト値をＮ−１個の文字の各々に割り当てる。
【００３７】
もう１つの相違は、テーブル１は４つの連続するバイト値をテーブルラベルに割り当て、これは、ポインタ又は文字として解釈されるものではなく、次のバイトがテーブルに対するポインタであることを指示するものである。テーブルラベルは、ＦＳＭの状態が非常に多数の出力遷移を有する場合にＦＳＭから形成されたストリング組データに到達するのに必要な時間を節減するために使用することのできる任意の技術である。テーブルラベルは、ＦＳＭトランスジューサが一般的なルールを要約する場合や、ＦＳＭが受け入れられるストリングの合成を許す場合や、又は受け入れられるストリングと句読点マークのような他のエレメントとの複合であるストリングを分類するのにＦＳＭが使用される場合に効果的であると分かっている。このような状況における状態は、非常に多数の出力遷移を有するＦＳＭのスタート状態としばしば類似している。
【００３８】
各テーブルは、各文字について１つづつのＮ−１個のエントリーで実施することができ、従って、他のラベル値、即ち文字バイトの各々に対して１つのエントリーがあり、テーブルラベルは最も高いラベル値を有するので、テーブルはテーブルラベル自体についてのエントリーを有する必要はない。これらエントリーは等しい長さのものであり、従って、所与のラベル値のエントリーは、ラベル値にエントリーの長さを乗算してテーブルに対するオフセットを得ることにより、アクセスすることができる。
【００３９】
各エントリーはラベルバイトで開始する。ラベル値を、テーブルラベルに先行する位置から一致できる場合には、ラベル値のエントリーは、同じラベル値のラベルバイトを有する。しかし、ラベル値を、テーブルラベルに先行する位置から一致できない場合には、ラベル値のエントリーは、異なったラベル値のラベルバイトを有し、例えば、テーブルラベルバイトは、一致することのできない各エントリーに対するラベルバイトとして使用することができる。というのは、そのラベル値がいずれのエントリーのラベル値とも異なるからである。
【００４０】
又、各エントリーは、ラベルバイトの後にポインタフィールドも備えており、このポインタフィールドは、全長ポインタを保持するに充分な大きさである。各全長ポインタは、例えば、３バイトであって、エントリーの長さが４バイトとなる。ラベル値をテーブルラベルに先行する位置から一致できる場合は、ラベル値のテーブルエントリーのポインタフィールドは、次のサブシーケンスがない場合に、ラベル又は特殊なＥＯＢバイトに対する次のサブシーケンスを指すポインタを含む。
【００４１】
上記したテーブルは、テーブルエントリーの幾つかが不適当となる状態により分担することができる。これは、テーブルラベルが常に最後の遷移となるように各状態の出力遷移を順序付けする場合に行うことができる。手前の出力遷移を用いて、テーブルエントリーが不適当となる遷移の情報を与えることができる。
【００４２】
一般に、どの状態の後にテーブルラベルが続くかの選択は、時間と空間の複雑な兼ね合いを伴い、これは主として特殊なデータ及びタスクに依存している。多数のテーブルを使用すると、サーチ速度が改善されるが、テーブルを含むストリング組データを記憶するのに必要な空間が増加される。ある状態においては、これらテーブルは著しい速度の改善を生じると共に、全空間を減少する。というのは、非常に多数の状態が所与のテーブルを分担できるからである。
【００４３】
文字に対する第１バイト値は２５６−４Ｎ（４の整数倍）である。それ故、各文字バイトの２つの下位ビットをマスクして、その文字を識別する６つの上位ビットを得ることができる。
【００４４】
文字バイトは逃避コードを含むことができる。この逃避コードと、ストリング組データにおいてそれに続く別のバイトとを使用して、文字の全数がＮ−１より大きい場合にそれら文字をエンコードすることができる。各サイズのポインタの数を最適にするようにＮを選択した場合にこのようになり勝ちである。
【００４５】
図１ないし４及びテーブル１に示すエンコードの基本的な特徴は多数の方法で適用することができ、これら特徴の幾つかを含むエンコード方法の例を以下に説明する。
【００４６】
Ｂ．エンコード方法
ＦＳＭデータ構造体は、従来、データ構造体の状態に対応するデータのユニットでエンコードされるので、ＦＳＭデータ構造体をエンコードする完全なプロセスは、通常、これら従来の状態ユニットから遷移ユニットを発生しそしてこれら遷移ユニットを適当に順序付けすることを含む。更に、エンコードプロセスは、エンコードされたＦＳＭデータ構造体を圧縮する効果を奏する段階を含んでもよい。図５は、遷移ユニットの発生及び順序付けの間に多数の点において圧縮を与える段階が生じるエンコードプロセスを示すフローチャートである。図６ないし９は、図５のエンコードプロセスの一部を詳細に示すフローチャートである。
【００４７】
図５のエンコードプロセスは、ボックス８０で示すように、状態に関するデータと、これら状態の対応する出力遷移に関するデータとを含むデータの本体を受け取ることによって開始する。このようなデータ本体は、例えば、１組のストリングに対応するＦＳＭデータ構造体である。各状態に関するデータは、一般に、その状態から導かれる遷移のリストと、その状態がその組における１つ以上のストリングの終わりであるかどうかの指示とを含む。各遷移に関するデータは、そのラベルと、その行き先である状態の指示とを含む。
【００４８】
次いで、ボックス８２において、関連遷移ユニットの順序を決定する各状態に関するデータを得なければならない。上記したように、遷移ユニットはあるシーケンスに順序付けされ、エンコードされたデータ構造体におけるポインタの必要性を減少することができる。というのは、このシーケンスを通して進むことにより第１及び別の出力遷移に到達することができるからである。しかしながら、データ構造体が手前の状態にループする遷移を含む場合には、ポインタが依然として必要である。又、以下で詳細に述べるように、ある状態が２つ以上の入力遷移を有していてその状態から従属する遷移を１回しか記憶する必要がない場合及び遷移ユニットの非常に長いブロックがポインタを用いてサブブロックに分割されてシーケンスを通して進む速度が不当に遅くならない場合にも、ポインタが依然として所望される。異なる長さのポインタを効率的に割り当てるために、ボックス８２に示すように、各状態に対する入力ポインタをカウントするのが有用である。又、ボックス８２には、各状態のコスト（その状態に依存する遷移ユニットのブロックがエンコードされたファイルにおいて占有するバイト数を意味する）がサブブロックの分割によって制限されることも示されている。
【００４９】
上記したように、ポインタは、２つ以上の入力遷移を有する各状態の後の遷移ユニットのブロックに割り当てられる。但し、ポインタが指す遷移ユニットのブロックよりそのポインタが短い場合である。このような状態を識別するために、各状態への入力ポインタのカウントは、例えば、第１遷移の後にその状態の入力遷移の各々について増加されてもよい。又、ポインタを、遷移ユニットの長さブロックから動かされたサブブロックに割り当て、エンコードされたデータ構造体においてそれに続く遷移ユニットのブロックの長さに関して状態のコストを制限することもでき、これは、別の遷移ユニットへの途中でその状態を通過するに必要な時間を制御する。又、このような各サブブロックの手前の状態に対する入力ポインタのカウントも追跡される。ボックス８４では、入力ポインタの数に基づいて状態が分類され、そしてポインタのサイズ及びそのサイズのポインタ又はインデックスが、入力ポインタを有する状態の第１出力遷移ユニットであって遷移ユニットの従属ブロックがポインタサイズよりも大きい第１出力遷移ユニットに割り当てられることが示されている。最も短いポインタインデックスは、ほとんどの入力ポインタを有する状態に割り当てられ、等々となって、全てのポインタインデックスが割り当てられそして全長ポインタが割り当てられる。
【００５０】
ポインタインデックス及びポインタがいったん割り当てられると、ボックス８６に示すように、遷移ユニットが発生されそして遷移ユニットに位置が割り当てられる。これを行う１つの方法は、最終的に最終状態へと導かれる各出力遷移に関するデータを状態ユニットから取り出しそして位置を入れることのできるフィールドを含むようにそれを拡張することである。最終的に最終状態に至らない遷移は取り除くことができる。位置が割り当てられると、対応するポインタインデックスを用いて各実際のメモリ位置を得ることのできるポインタテーブルを完成できるようになる。更に、この段階中に、スタート状態からの遷移ユニットの位置を含むテーブルを形成して、アクセス速度を高めることができる。
【００５１】
又、非常に多数の出力遷移を有する他の状態に対しても、同様のテーブルを形成して、例えば、その状態からの第１出力遷移を一緒に含ませ、アクセス速度を上げることができる。インデックスがテーブルとして使用されて、各ビットが、それに対応する文字が特定の状態からの遷移を有するかどうかを指示する場合には、多数の出力遷移を有する状態に対し空間の節約を実現することができる。というのは、出力遷移のラベルをテーブルとは個別に記憶する必要がなくなるからである。テーブルの使用を指示するために、次に続く一連のバイトが所定長さの文字テーブルであることを指示するものとして図４からの１バイト値を割り当てることができる。受け取った文字の値を現在アドレスに加算して、最終的に最終状態へ至る遷移をその文字が有するかどうかを指示するビットを見つけることができる。しかしながら、一般に、多数の出力遷移を有する状態についてはテーブルを使用するのが効果的である。というのは、文字バイトを、固定数のバイトをもつ遷移に置き換えるからである。
【００５２】
ボックス８８において、テーブル及び遷移ユニットは、それらの位置に基づく順序でファイルに書き込まれる。バイト値は、そのラベルに基づくと共に、上記したようにそれが別のものを有しているか最終のものであるか又は分岐路の終わりであるかに基づいて、各遷移ユニットに割り当てられる。しかしながら、バイト値が書き込まれる前に、受け取った文字を、遷移ユニットにおけるラベルの値に対応する値に変換するためのテーブルを形成するのが適当であろう。次いで、ファイル内の多数の位置を使用して、最初の遷移或いは第１文字テーブル及びポインタテーブルが記憶される。更に、遷移ユニット及びポインタ自体のシーケンスがファイルに入力されてもよい。この点において、ファイルが完成し、以下に述べるように使用に供することができる。
【００５３】
図５の段階の詳細は、図５の段階の特定の実施を示すフローチャートである図６ないし９から更に良く理解することができよう。図６は、状態に関するデータをボックス８２においていかに得るかを更に詳細に示している。図７は、ボックス８４においてポインタをいかに割り当てるかを詳細に示している。図８は、ボックス８６において位置をいかに割り当てるかを示している。図９は、ボックス８８においてファイルをいかに書き込むかを示している。
【００５４】
図６のフローチャートはサブルーチンの呼び出しで始まり、この呼び出しは、ボックス９０に示すように、現在走査されている状態を識別することを含む。ボックス９２において、その状態がサブルーチンによって以前に尋ねられたものであるかどうかをチェックするテストが行われる。もしそうであれば、それは既に走査されており、再び走査する必要はない。というのは、以下に述べるように、走査プロセスは、状態を記憶する準備段階において、その走査された状態に基づく全ての状態を繰り返し走査するからである。それ故、既に走査された状態に基づく遷移ユニットのブロックを再び記憶する必要はなく、既に走査された遷移ブロックを指すポインタと置き換えることができる。ボックス９４において、その状態に対する入力ポインタの数であるＩｎＰｏｉｎｔｅｒｓが、使用されるポインタとして増加される。次いで、ボックス９６において、走査の結果が、ポインタインデックスのサイズの推定値であるＰｏｉｎｔｅｒ  Ｃｏｓｔ値に等しくセットされ、この走査結果は、次いで、図６のルーチンを呼び出したルーチンへ返送される。
【００５５】
同様に、ボックス９８において、以前に尋ねられなかった状態に対してテストを実行して、その状態が何らかの残りの出力遷移を有しているかどうかをチェックする。もしそうであれば、これら遷移が導かれる行き先が走査される。出力遷移は、任意の順序になるか、或いはエンコードプロセスに先行する分類の結果による順序になり、ボックス１００において、上位の未走査遷移の行き先が、反復呼び出しの際に、図６に示されたルーチンの開始（それが呼び出されたルーチンの開始Ａと区別するためにＡ’と示されている）へ送られる。反復呼び出しされたルーチンが完了すると、その走査結果をＢ’（それが呼び出されたルーチンの返送部Ｂと再び区別されている）において返送する。
【００５６】
反復呼び出しされたルーチンの完了時に、ボックス１０１においてテストが行われて、行き先のコストがＰｏｉｎｔｅｒ  Ｃｏｓｔを越えるかどうかの判断がなされる。もしそうであれば、現在状態からポインタを経てこの行き先に対する情報には通常は到達しない。しかしながら、現在状態の全コストが、許容最大コストである値Ｍを越える場合には、この行き先をリモート位置へ移動しそして現在状態のブロック内にそれを指すポインタを含ませるだけで、過剰なコストを減少することができる。それ故、行き先は、後で考慮するために、ｃｏｓｔｒｙＤｅｓｔｓと称するリストに入れられる。次いで、出力遷移が導かれてきたところの状態のコストが、ボックス１０２において、ラベルをもつ遷移ユニットのコストと返送された走査結果との和だけ増加される。走査結果は、もちろん、出力遷移の行き先のコストである。ラベルをもつ遷移ユニットのコストは、典型的に、１である。次いで、ルーチンはボックス９８へ復帰し、同じ状態の更に別の出力遷移が走査のために残っているかどうかテストされる。
【００５７】
ＦＳＭデータ構造体は１つのスタート状態しかもたないので、図６の反復ルーチンでは、スタート状態から始めて全データ構造体が走査される。スタート状態の出力遷移の各々が走査されるときには、その遷移から従属するデータ構造体の分岐路全体が走査される。それ故、スタート状態の全ての出力遷移が走査されたときには、ボックス９８ないし１０２を含むループ内に含まれた反復の結果としてデータ構造体全体が走査されている。
【００５８】
状態の出力遷移が全て走査されたときには、ボックス１０４においてその状態のコストがテストされ、許容最大コストである値Ｍを越えるかどうかの判断がなされる。この最大コストはある程度任意のものでよく、別の出力遷移に到達するために状態から従属する分岐路を通過するのに費やす時間を制限するように働くものである。時間が減少される理由は、ブロックが分岐路から除去されて、それらの位置を指すポインタと置き換えられたからである。別の分岐路が得られるときには、これらのポインタがスキップされる。時間が全く問題にならず、データ構造体を記憶するのに必要なメモリ量が主たる問題である場合には、ボックス１０４のテストは不要である。
【００５９】
状態コストがＭを越える場合には、ボックス１０１で決定されたその状態からのコストのかかる行き先が、ボックス１０６において、それらの各々のコストに基づいて分類される。次いで、ループはボックス１０８で始まり、ｃｏｓｔｌｙＤｅｓｔｓからの最もコストのかかる行き先のＩｎＰｏｉｎｔｅｒｓ値が増加される。次いで、ボックス１１０において、その最もコストのかかる行き先で始まりそしてそこから従属する遷移及び状態を含んでいるブロックがルートリストへ移動される。このルートリストは、ポインタによって常時アクセスされるブロックのリストであり、換言すれば、ルートリスト内の各ブロックは、そこに導かれるいずれの遷移ユニットの直後にも配置されない遷移ユニットで開始される。ルートリストは、スタート状態で始まるブロックをその最後のエレメントとして有し、そしてその他のブロックは、ＦＳＭデータ構造体のこの走査中にそれらに遭遇したときにリストの前部に押し込まれる。ブロックの相対的な位置は任意であるから、ルートリストにおいてブロックの別の構成を使用することもでき、そしてスタート状態をルートリストの最後に押し込むこともできる。
【００６０】
ボックス１１２では、現在状態のコストがポインタコスト値によって増加されるが、ルートリストへ移動されたブロックのコストにより減少される。次いで、ボックス１１４において、コストが再び値Ｍと比較され、状態のコストを最大値より低くもっていくためにブロック１０８ないし１１４を繰り返すべきであるかどうか判断する。
【００６１】
状態コストがもはや最大値Ｍを越えないときには、ボックス１１６においてそれが走査結果として返送される。この走査結果は、典型的に、図６のルーチンを繰り返し呼び出したルーチンのボックス１００へ返送される。しかしながら、返送されているコストがスタート状態のコストであるときには、走査結果は図５の全ルーチンへ返送される。この情報項目に加えて、図６のルーチンは、状態のＩｎＰｏｉｎｔｅｒｓを記憶し、図５のボックス８４において分類を行えるようにする。
【００６２】
図７は、図５のボックス８４を実施する一連の段階を詳細に示している。ボックス１２０において、ＦＳＭデータ構造体の状態は、既に決定されている各々のＩｎＰｏｉｎｔｅｒｓ値に基づいて分類され、最も多数の入力ポインタをもつ状態が分類リストの始めに来るようにされる。次いで、ボックス１２２において、ポインタサイズ及びポインタもしくはポインタインデックスをその分類された状態に割り当てる反復プロセスが最も短いポインタサイズで開始される。最も短いポインタインデックスは１バイト長さであり、中間サイズのポインタインデックスは２バイト長さであり、そして長いポインタは全３バイト長さである。各サイズは、それに対応する数の使用可能な値を有し、これは、短い及び中間サイズのポインタに対するポインタインデックス値、及び全長ポインタに対するポインタ値となる。
【００６３】
現在ポインタサイズにおける使用可能なポインタインデックス又はポインタの数は、ボックス１２４において、現在ポインタ又はポインタインデックスと比較され、そのサイズの全てのポインタ又はインデックスが割り当てられたかどうかのチェックがなされる。もしそうでなければ、ボックス１２６において、分類された状態のうちの上位の状態のＩｎＰｏｉｎｔｅｒｓ値が０であるかどうか判断するためにテストが行われる。
【００６４】
ＩｎＰｏｉｎｔｅｒｓ値が依然として０より大きい場合には、ボックス１３０においてテストを行って、現在状態のもとで、全３バイトポインタが当然に唯一の適当なポインタサイズであるかどうかの判断がなされる。これは、他のポインタが使い尽くされた場合だけでなく、ＩｎＰｏｉｎｔｅｒｓの数が１に過ぎない場合又はＩｎＰｏｉｎｔｅｒｓの数が２であって且つ現在ポインタサイズが２である場合にも言えることである。これら後者の場合には、短いポインタサイズは有効でない。というのは、ＩｎＰｏｉｎｔｅｒｓの数が小さいときには、ポインタインデックスとポインタテーブルのエントリーとによって占有される空間が、全長ポインタによって占有される空間より大きくなるからである。
【００６５】
全長ポインタのみが適当である場合には、ボックス１３２においてテストを行って、使用されるメモリ空間を減少するという点で全長ポインタが有用であるかどうか判断される。これは、ポインタが現在状態より多くの空間を消費しないように現在状態のコストが現在ポインタサイズ以上であるかどうかを最初にテストすることによって行われる。ポインタサイズが３に等しい場合には、更にテストを行って、それでもポインタが有用であるかどうか判断することができる。というのは、現在状態のコストが３だからであり、或いは現在状態のコストが２で、その第１遷移の行き先が少なくとも２のコストを有しそしてその行き先の現在ポインタサイズが１でないからである。行き先のポインタサイズは１でないから、それが０であって、２以上のポインタサイズしか割り当てできないことを意味するか、又はそれが既に少なくとも２であって、現在状態の実際のコストが３以上であり、ポインタを有用なものにするかのいずれかである。全長ポインタが有用である場合には、ボックス１３４において、分類されたリストの上位の状態に全長ポインタサイズが割り当てられる。ボックス１３４の後に、又はボックス１３２のテストが否定結果であった場合に、ルーチンはボックス１３６において次の分類状態へ進み、ボックス１２４において上位状態として次の状態で別の反復を開始するように復帰する。
【００６６】
ボックス１３０のテストが否定結果であった場合には、ボックス１３８のテストで、現在ポインタサイズのポインタが有用であるかどうか判断され、これは、現在状態のコストが現在ポインタサイズより大きい場合に真となる。又、現在ポインタサイズが２の場合には、全長ポインタについて上記した同じテストを行って、中間サイズ長さのポインタが有用であるかどうかを判断することができる。もしそうである場合には、ボックス１４０において、その上位の状態に現在ポインタサイズ及び現在ポインタインデックスが割り当てられる。次いで、ポインタインデックスはボックス１４２において増加され、ルーチンはボックス１３６において次の状態へ進む。しかしながら、ボックス１３８のテストが否定結果である場合には、ルーチンはボックス１３６の次の状態へ直ちに進む。
【００６７】
ボックス１２４及び１２６のテストの一方が肯定結果となるまで反復が続けられる。次いで、ボックス１４４において、現在ポインタインデックスが、割り当てられたサイズのポインタの数として返送される。この値は、そのサイズの使用可能なポインタの数より小さいことがある。というのは、ポインタはそれが有用なときしか割り当てられないからである。現在ポインタサイズが最長のポインタサイズでないことがボックス１４６で決定された場合には、ルーチンはボックス１４８において次のポインタサイズへ進み、次いで、ボックス１２４へと復帰する。しかしながら、最長のポインタサイズが完了した場合には、ルーチンは図５のボックス８６の機能へと進み、これは図８に示すように実施される。
【００６８】
図８の機能は、図５のボックス８４から入る。最初の段階であるボックス１５８では、尋ねられたルートリストの状態がマークされ、この走査中にこれら状態の１つが尋ねられたときにポインタが割り当てられるよう確保する。ボックス１６０でテストして、ルートリストに未処理の状態がある場合には、これら未処理の状態の１つがボックス１６２において与えられ、そしてボックス１６４において、その与えられた状態がチェックされて、それがポインタサイズを有するかどうか調べられる。もしそうであれば、遷移ユニットの全シーケンスにおけるバイトの現在割り当て位置を表すバイトナンバーが、ボックス１６６において、ポインタサイズに基づいて割り当てられる。ポインタサイズが長くて、全長ポインタが使用されることを意味する場合には、バイトナンバーが全長ポインタの値として割り当てられる。さもなくば、バイトナンバーは、その状態に割り当てられたポインタインデックスに対応する適当なポインタテーブル内の位置に割り当てられる。通常は、データの状態ユニットがエンコードされたＦＳＭデータ構造体に含まれず、従って、バイトナンバーは状態自体に割り当てられる必要はなく、第１の出力遷移ユニットのみに割り当てられる。それ故、ボックス１６６におけるバイトナンバーの割り当ては、適宜に第１の出力遷移ユニットを指すポインタを与えるようにのみ働く。
【００６９】
ボックス１６４が否定結果である場合又はボックス１６６におけるバイトナンバーの割り当てが完了したときには、バイトナンバーの値が現在状態から従属する遷移ユニットに割り当てられる。これは、ボックス１６８においてその状態からのいずれかの出力遷移が、遷移ユニットを発生させそして値を割り当てるべく残されているかどうかテストするところから始まる。もしそうであれば、残っている遷移の上位の１つに対して遷移ユニットが発生され、そしてボックス１７０において現在バイトナンバーがそれに割り当てられる。次いで、その遷移の行き先が、ボックス１７２において、ポインタリストを通る現在の反復中に既に尋ねられたという指示に対してチェックされる。その行き先を最初に尋ねる際には、その結果が否定であり、ボックス１７４において、その行き先が、この反復において尋ねられているという指示でマークされる。次いで、ボックス１７６においてバイトナンバーが増加され、ボックス１７８においてその行き先が与えられて図８のルーチンの一部分の反復呼び出しが開始される。この反復呼び出しはＡ’で開始され、これは、呼び出しルーチンが図８のルーチンに入る位置Ａと区別される。同様に、反復呼び出しはＢ’で終わり、これも、呼び出しルーチンが図８のルーチンを出る位置Ｂと区別される。それ故、反復呼び出しされる図８の唯一の部分は、ボックス１６４ないし１８２を含む部分である。反復呼び出しが完了した後、残りの遷移に対する別のテストがボックス１６８において行われる。
【００７０】
ボックス１７２が肯定結果を生じて、その行き先が以前に尋ねられていることを指示する場合には、ボックス１８０において別のテストが行われて、その行き先にポインタサイズが割り当てられているかどうかの判断がなされる。もし割り当てられていなければ、その行き先から従属している遷移ユニットはポインタが有用にならないほど僅かであり、ボックス１７４ないし１７８を経て行き先に対して同じ反復が行われる。しかしながら、ボックス１７４における尋ねられた行き先のマーク付けはこの場合は不要であり、プログラミングを簡単にするためにのみ行われる。一方、行き先がポインタサイズを有する場合には、ポインタ又はインデックスが現在遷移ユニットの後に上記エンコードされたデータ構造体に挿入されて、その行き先からの第１出力遷移を指す。それ故、バイトナンバー値を次の遷移ユニットに割り当てる前に、ボックス８１２においてバイトナンバーを１＋行き先のポインタサイズだけ増加することが必要である。
【００７１】
ボックス１６０ないし１８２の機能は、ルートリストの全ての状態にバイトナンバー値が割り当てられるまで繰り返し実行される。その時点で、ボックス１６０のテストが否定結果となり、ボックス１９０において、現在バイトナンバーが返送される。次いで、ボックス１９２においてテストを行い、バイトの全数が、現在ポインタテーブルエントリーサイズでアドレス可能な空間内に記憶することのできる数より大きいかどうか判断される。例えば、２バイトのテーブルエントリー即ち１６ビットが使用されている場合には、６５，５３５バイトがアドレス可能である。このエンコード技術は、より大きなデータ構造体にも等しく適用できる。このような場合は、３バイトテーブルエントリーを使用することができ、全長ポインタの第１バイトについては図４の空間からのバイト値の多くを使用することができる。
【００７２】
ボックス１９２において、バイトの全数がアドレス可能なバイトを越えると判断した場合には、ポインタテーブルエントリーはそれらが指す幾つかの遷移ユニットのアドレスを記憶するのに不充分であるから、オーバーフローが生じる。このオーバーフローは、ボックス１９４において、テーブルフィールドのサイズを増加するような適当な技術によって調整されるか、或いはそれで不充分な場合には、影響を受けるポインタを全長ポインタに変更しそして対応するエントリーをポインタテーブルブランクに残すことによって調整される。しかしながら、これは全シーケンス内の他のバイトの位置に影響を与えるので、ボックス１６０ないし１８２における機能の別の反復を、既に使用されたものとは異なる尋ねマークで実行することが必要とされる。オーバーフローが修正されそしてバイトナンバー値が再び割り当てられると、ボックス１９２において否定結果が生じ、ルーチンは図５のボックス８８へ進み、これは図９に示すように実施される。
【００７３】
図９の機能は、図示されたように、図５のボックス８６から入ることができ、エンコードされたＦＳＭデータ構造体をファイルに書き込むものである。先ず、ボックス２００において、ルックアップの間に必要な値を含むインデックスヘッダが書き込まれる。これらの値は、スタート状態が最終であるかどうかを指示するためのフラグ；アルファベットのサイズＮ；ポインタテーブルエントリーのサイズ；ポインタデータユニットの各形式が始まるバイト値マップにおけるバイト値；ラベルバイトが始まるバイト値マップにおけるバイト値（２５６−６Ｎ）；及びファイル自体におけるデータのテーブル又はブロックの各々のスタート位置を含む。次いで、ボックス２０２において、文字のコードが書き込まれ、これは典型的にＡＳＣＩＩコードである。これらのコードは、受け取った文字を、エンコードされたデータ構造体においてそれらを表す値に変換するのに用いられるテーブルを形成する。次の段階は、ボックス２０４において短いポインタテーブルを書き込みそしてボックス２０６において中間サイズのポインタテーブルを書き込むことであり、各々の場合に一連のポインタが書き込まれる。
【００７４】
次いで、ボックス２０８ないし２１４において、アルファベットの文字がシーケンスで与えられそして値が繰り返し割り当てられて、スタート状態の出力遷移に対する位置のテーブルが形成される。各文字に割り当てられる値は、その文字に一致するラベルを有した上記スタート状態からの第１出力遷移ユニットの位置である。ボックス２０８において値を割り当てるべき文字が残っているかどうかをテストした後に、ボックス２１０において、スタート状態からの遷移ユニットのいずれかがその残っている文字のうちの次の文字に一致するラベルを有しているかどうかを判断するテストが実行される。もし有していなければ、ボックス２１２において、スタート状態からの最後の出力遷移ユニットの位置である標準的な値が書き込まれる。というのは、この遷移ユニットは、確かに不一致の正しい結果を与えるが、別のものをもたないので、不一致が検出された後はそれ以上の比較が行われないからである。文字が一致する出力遷移ユニットを有していない場合には、その一致する遷移ユニットの位置がボックス２１４において書き込まれる。いずれの場合にも、残りの文字に対するボックス２０８のテストが繰り返される。ボックス２０８ないし２１４の反復サブルーチンは、スタート状態の出力遷移に対してより迅速にエントリーできるようにし、そして同様のサブルーチンを使用して、ＦＳＭデータ構造体内の他の状態の出力遷移をより速い速度でアクセスすることができる。このデータ構造体は、僅かな出力遷移を有するのではなくて、非常に多数の出力遷移を有していて、しかも、その多くは従属遷移ユニットの大きなブロックを有するものである。この特殊なケースは、１つの独特のバイト値をその目的で割り当てることによって指示することができる。ボックス２０８のテストが否定結果になったときには、第１文字位置のテーブルが完成する。
【００７５】
図８の場合と同様に、ルートリストの状態は、ボックス２１６において、この走査で尋ねられたとして最初にマークされ、この走査中にこれら状態の１つが尋ねられたときにポインタが割り当てられるよう確保する。次いで、エンコードされたＦＳＭデータ構造体の遷移ユニットの書き込みが、ボックス２１８ないし２３４を含む反復サブルーチンにおいて行われる。ボックス２１８のテストで、何らかの未処理の状態がルートリストに残されているかどうか判断される。上記したように、ＦＳＭデータ構造体の遷移ユニットは、ルートリストの状態から従属するブロックの１つの中にあり、ルートリストには当然スタート状態が含まれている。それ故、ルートリストを通して進むことにより、エンコードされたＦＳＭデータ構造体の全ての遷移ユニットが処理され、適宜に書き込まれる。最後の遷移ユニットが書き込まれると、ボックス２１８が否定結果となる。この場合に、全ファイルの長さがボックス２３６においてファイルの第１位置に書き込まれ、そしてルーチンが終了となる。
【００７６】
ルートリストからの未処理の状態は、ボックス２２０において、ボックス２１８のテストが肯定結果である場合に与えられる。次いで、ボックス２２２において、その状態が残りの出力遷移に対してテストされる。残りの出力遷移がない場合には、ボックス２１８のテストが何の書き込みもせずに繰り返され、従って、エンコードされたＦＳＭデータ構造体は、状態ユニットなしに書き込まれるか、又は出力遷移をもたない状態に関連したデータの他の個別ユニットなしに書き込まれる。このような状態についての全ての必要な情報は、その状態に通じる遷移ユニットに含まれる。
【００７７】
状態が残りの出力遷移を有する場合には、ボックス２２４において、更に別の反復サブルーチンが行われて、第１の即ち上位の遷移ユニットのバイト値で始めて適当なデータが書き込まれる。このバイト値は、図４と同様のバイト値マップに基づいており、その遷移ユニットのラベルである文字の値が適当なバイト値ブロック内の第１バイト値に加えられて、書き込まれるべきバイト値に到達する。どのブロックが適当であるかは、上記したように、別のビット、最終ビット及びＥＯＢビットの値に基づいている。
【００７８】
遷移ユニットのバイト値が書き込まれたときには、ボックス２２６のテストが行われて、その遷移ユニットの行き先がこの走査の前に尋ねられたかどうか判断される。もしそうであれば、ボックス２２８の更に別のテストで、行き先がそれを指すポインタを有しているかどうか判断される。これらテストのいずれかが否定結果を生じる場合には、その行き先がボックス２３０において尋ねられたとマークされ、ボックス２３２の反復呼び出しの際に与えられる。この呼び出しは、図９のルーチンの位置Ａに対応するＡ’において繰り返し呼び出されるルーチンに入る。これは、図９の位置Ｂに対応するＢ’において繰り返し呼び出されるルーチンを出る。それ故、繰り返し呼び出されるルーチンは、ボックス２２２ないし２３４の反復サブルーチンしか含まない。上記した他の走査の場合と同様に、繰り返し呼び出しの作用は、ルートリストの状態から従属するＦＳＭデータ構造体の全ブロックのバイト値及びポインタを書き込むことである。
【００７９】
ボックス２２６及び２２８のテストが両方とも肯定結果である場合には、その行き先は既に尋ねられていてポインタを有しており、従って、ボックス２２０に復帰する前に、ボックス２３４でその行き先ポインタを書き込むことが必要とされるだけである。この場合に、ルーチンの繰り返し呼び出しは不要である。
【００８０】
図９のルーチンが完了すると、エンコードされたＦＳＭデータ構造体を含むファイルは、図１０に示す内容をもつことになる。全ファイルの長さは、０と示された第１バイト位置に現れる。長さＬのインデックスヘッダは、バイト位置１ないしＬに現れる。次いで、シーケンス内の文字に対応するＡＳＣＩＩコードがバイト位置Ｌ＋１ないしＬ＋Ｎに現れる。次いで、長さＳの短いポインタテーブルがバイト位置Ｌ＋Ｎ＋１で始まって現れる。次に、長さＭの中間サイズのポインタテーブルがバイト位置Ｌ＋Ｎ＋Ｓ＋１で始まって現れる。次いで、各文字のスタート状態からの第１遷移の位置が、各々長さＢで、バイト位置Ｌ＋Ｎ＋Ｓ＋Ｍ＋１で始まって記憶される。最後に、ポインタリストにより全シーケンス内の遷移ユニット及びポインタがバイト位置（Ｌ＋Ｎ（Ｂ＋１）＋Ｓ＋Ｍ＋１）で始まり、ファイルの終わりまで続く。
【００８１】
図１０に示すファイルは、ＲＯＭへの記憶又はディスケットのようなポータブルメモリ媒体への記憶を含む適当な形態で記憶することができる。受け取った文字ストリングの評価にこれを使用するときは、上記した比較的簡単な一連の段階が実行される。
【００８２】
Ｃ．製品の使用
上記したエンコード技術は、エンコードされたＦＳＭデータ構造体をどのように使用するかをほぼ決定する。エンコードされたＦＳＭデータ構造体を通常使用する１つの特定のタスクは、受け取った文字ストリングをチェック又は評価してそれがＦＳＭによりカバーされたストリングの組の中にあるものかどうかを決定することである。本質的に、ＦＳＭデータ構造体は、受け取ったストリングをルックアップするのに使用され、その受け取ったストリングが見つかったかどうかを指示する適当な信号が発生される。
【００８３】
図１１は、図１０に示したものと同様のエンコードされたＦＳＭデータ構造体に適したルックアップ方法を示すフローチャートである。
【００８４】
エンコードされたＦＳＭデータ構造体においてルックアップされるべき文字ストリングがボックス２４０において受け取られる。ボックス２４２における予めのテストによりそのストリングが文字を有しているかどうかが決定され、もし有していない場合には、ボックス２４４においてスタート状態の最終ビットの値が返送され、これは、ＦＳＭデータ構造体がナルストリングを受け入れるかどうかを指示する。上記したように、スタート状態の最終ビットがファイルのインデックスヘッダに記憶され、この段階を行えるようにする。しかしながら、ストリングが少なくとも１つの文字を有する場合には、ルーチンは、ボックス２４６において、そのストリングの第１文字に対し第１文字のルックアップテーブルに指定された位置へ進む。これは、文字をＡＳＣＩＩからデータ構造体内の対応する値に変換しそしてその値に対応する第１文字テーブル内のエントリーをアクセスして、その文字に対応するスタート状態からの遷移ユニットの位置を得ることによって行われる。テーブルエントリーは、シークされる遷移ユニットの実際の位置を得るためにデータ構造体内の第１のエンコードされた遷移ユニットの位置に加えられるオフセットである。
【００８５】
次いで、反復サブルーチンがボックス２４８のテストで始まり、その文字が現在位置における遷移ユニットのラベルに等しいかどうか判断される。もしそうであれば、文字は一致する。通常は、第１の反復の際に、一致が生じなければならない。というのは、その文字を用いて位置が得られたからである。しかし、スタート状態からの出力遷移をもたない文字の場合には、一致が生じない。というのは、上記したように、第１文字テーブルのテーブルエントリーは、確実に一致しない遷移ユニットの位置だからである。
【００８６】
ボックス２４８において一致が生じた場合には、ボックス２５０の更に別のテストでその文字がストリングの最後のものであるかどうか判断される。これは、文字の数をストリング内の文字の数と比較することによって行われる。もし最後の文字であれば、ストリングの全ての文字が遷移ユニットからのラベルと一致しており、残りの質問は、最後の遷移ユニットが最終であるかどうかだけである。それ故、現在位置における遷移ユニットの最終ビット値がボックス２５２において返送され、これは、受け取ったストリングがエンコードされたデータ構造体でカバーされた組の中にあったかどうかをその値で指示する。
【００８７】
一致した文字が受け取ったストリングの最後のものでない場合には、ボックス２５４のテストで、現在位置が後続項目（その行き先が少なくとも１つの出力遷移ユニットを有することを意味する）を有するかどうかを判断する。後続項目がある場合には、ボックス２５８において、ルーチンがそこへ進み、即ち第１出力遷移ユニットの位置へ進む。ボックス２５４のテストは、現在位置におけるバイト値のＥＯＢビットをチェックすることによって開始される。これが０の場合には、後続項目があり、データ構造体内の次の位置へ進むことによってこれに到達する。しかしながら、その値がポインタである場合には、そのポインタによって指示された位置へルーチンが進む。これは、全長ポインタの場合には直接そこへ進み、或いは短い又は中間サイズのポインタインデックスの場合には適当なポインタテーブルを入力してその位置を得ることによりそこへ進む。次の位置に記憶された値によって適当な動作を決定することができ、この値は、図４のバイトマップのラベル部分又はポインタ部分のいずれかの値であることに注意されたい。又、ボックス２６０においては、受け取ったストリングの次の文字へ進むことも必要とされ、その後に、ボックス２４８のテストへと復帰する。現在位置が後続項目を有していない場合には、ボックス２５６においてナルが返送される。というのは、現在状態が出力遷移を有していないためにストリングのそれ以上の文字を一致することができないからである。
【００８８】
ボックス２４８において不一致が生じたときには、ルーチンは、ボックス２６２において、現在位置にある遷移ユニットが別の出力遷移ユニットを有するかどうか判断しなければならない。これは、現在遷移ユニットの別のビットをテストすることによって行われる。上記した最終ビット及びＥＯＢビットについては、遷移ユニットのバイト値をテストして図４のラベルのブロックのどれがそれを含むかを判断することによりこのテストを簡単に行うことができる。遷移ユニットが別のものをもたない場合は、ボックス２６４においてナルが返送される。
【００８９】
別の遷移ユニットがある場合には、ルーチンは、ボックス２６６においてその別の遷移ユニットの位置へと進む。ルーチンは、データ構造体を通して一度に１位置づつ進み、遭遇する各別のビットごとにカウンタを増加し、そして遭遇する各ＥＯＢビットごとにカウンタを減少することにより、カウンタが０の値に達するまで進む。データ構造体を通して進む間に遭遇するポインタはスキップされるが、カウンタは減少される。これは、別のビットの数が、指示されたブロック内のＥＯＢビットの数よりも１だけ小さくなければならず、従って、ポインタにより指示された遷移ユニットのブロックを通して進まずにカウンタを１だけ減少させることが必要だからである。カウンタが最終的に０に達して、別のビット及びＥＯＢビットの数がバランスすると、データ構造体を通る更に１つのステップがルックアップルーチンを別のビットの位置へもっていくか、又は別のビットを指すポインタ又はインデックスへもっていく。上記した一致の後の後続項目の探索については、次の位置にあるバイト値がテストされて、それがラベルを含んでいるか、或いは別の状態と分担される別のものの位置へ至るポインタデータユニットであるかの判断がなされる。別のものの位置へ到達すると、ルーチンはボックス２４８のテストに復帰する。
【００９０】
Ｄ．ＦＳＭデータ構造体の形式
図５ないし１０のエンコード技術は、各遷移が単一のアルファベット文字でラベル表示される図１の簡単な確定ループなしのデータ構造体に加えて、ＦＳＭデータ構造体に多数の他の変更を受け入れることができる。しかしながら、ある場合には、これらの変更は、ＦＳＭデータ構造体の変更によりルックアップ方法の修正を必要とする。
【００９１】
図５ないし１０の特定のエンコード技術は、例えば、非確定のＦＳＭデータ構造体と共に使用することができる。しかしながら、非確定のデータ構造体の場合には、全ての一致をピックアップするために状態の全ての出力遷移をチェックできるように図１１のルックアップ方法を修正しなければならない。というのは、非確定のデータ構造体の状態は、単一のラベルをもつ２つ以上の出力遷移を有することがあるからである。ルックアップ方法は、例えば、一致する出力遷移に遭遇した位置を追跡し、そして受け取ったストリングのその後の文字の別の一致に対してこのような各遷移へ復帰することができる。
【００９２】
又、図５ないし１０の特定のエンコード技術は、ループを含むデータ構造体と共に使用することもできる。ＦＳＭデー構造体にループを含むことにより、無限のストリング組をカバーすることができる。ループは、例えば、ポインタが適切に割り当てられれば、任意の順序で生じる接頭語のような多数のサブストリングをカバーするＦＳＭデー構造体に使用される。ループにおいて到達する状態には当然ポインタが割り当てられるので、エンコード技術は何らの変更も必要としない。ポインタが適切に割り当てられる限りは、図１１のルックアップ方法は、ループ式データ構造体として機能するはずである。
【００９３】
ある非確定ＦＳＭデータ構造体は、ε又は空遷移と称する特殊な形式の遷移を含み、これは、受け取ったストリングの次のエレメントへ進むことなくデータ構造体を通して進むことができるものである。ε遷移は、多数の状態が出力遷移の異なるグループを有しているが、出力遷移の各グループが互いに他と共通のサブ組を分担する場合にＦＳＭデータ構造体のサイズを減少するのに用いることができる。共通のサブ組は、状態の１つに対して適当な位置に記憶されるが、他の状態の各々は、その共通のサブ組へと通じるε出力遷移を有する。又、このε遷移は、以下に述べるように、他の目的で使用することもできる。
【００９４】
ε遷移を使用する場合には、エンコード技術を若干変更する必要がある。例えば、文字の組は、ε遷移に対して少なくとも１つの個別の文字を含まなければならない。しかしながら、各ε文字を通常の文字として処理するのではなく、それに独特のバイト値を与えるのが適当である。それ故、独特のバイト値を各々もつ２つ以上のε文字が、別のビット及びＥＯＢビットの考えられる組み合わせごとに１つづ、必要となる。しかしながら、ε遷移が常に状態からの最後の出力遷移であるならば多くの場合ε文字は不要となることに注意されたい。というのは、ε遷移は、その行き先の第１出力遷移を指すポインタとして簡単にエンコードできるからである。一般に、ルックアップ方法は、ε遷移に遭遇するときには位置を追跡するが、そのラベルを一致させるような試みはなされず、それが導かれる状態の第１出力遷移がアクセスされることになる。
【００９５】
多数のその他の変更は、ＦＳＭデータ構造体内に記憶された付加的な情報に関するものである。例えば、データ構造体は、最終状態に達したときに適当な出力を与えてもよい。この適当な出力は、各最終遷移の直後の所定長さのフィールドに記憶され、受け取ったストリングに更に文字が残っている場合はルックアップ方法がこの出力をスキップするが、最後の文字が最終遷移に一致する場合はこの出力を与えるようにすることができる。この場合に、出力の存在は、ファイルのヘッダ内のビットによって指示され、状態コストを計算する際にこれを考慮に入れることもできる。別の解決策では最終状態からのε遷移が使用され、これらのε遷移はポインタを介してこれら出力に通じている。これは、多数の最終遷移の後に同じ出力が生じた場合に特に有用である。同様に、ＦＳＭ内のインデックス又はポインタは、ε遷移を使用せずに出力に通じることができるが、これも、受け取ったストリングに更に文字が残っている場合にはインデックス又はポインタをスキップすることを必要とする。
【００９６】
更に別の変更は、バイト値の１つのブロックを用いて、第２の文字が続くことを指示し、従って、遷移ユニットが一対の値を含むようなデータ構造体である。例えば、その一方の値は受け取ったストリングの文字と比較することができそしてその他方はその比較が特定の結果となる場合に出力できるものである。又は、２つのストリングを受け取り、その一方のストリングの文字を一方の値と比較しそして他方のストリングの文字を他方の値と比較することもできる。このようにして、有限状態トランスジューサを表すＦＳＭデータ構造体をエンコードすることができる。
【００９７】
一般に、エンコード技術は、適当に変更することによりいかなるＦＳＭデータ構造体にも適用することができると共に、非ＦＳＭデータ構造体にも適用することができる。
【００９８】
Ｅ．エンコード及びルックアップ装置
エンコード及びルックアップ技術は、ＦＳＭデータ構造体をエンコードしそしてこのエンコードしたデータ構造体において受け取ったエレメントのストリングをルックアップするという機能を果たすために適当な装置において実施することができる。図１２はエンコード装置を示しそして図１３はルックアップ装置を示している。
【００９９】
エンコード装置３００は、図１２に示すように、中央処理ユニット（ＣＰＵ）３０２を中心とするもので、これは、エンコードを実行するようにプログラムすることのできる何らかのデータ処理システムである。
【０１００】
ＣＰＵ３０２は、ＦＳＭ入力バッファ３０４からエンコードされるべきＦＳＭデータ構造体を受け取る。バッファ３０４は、データ構造体を記憶することのできるメモリであるが、エンコードされるべきＦＳＭデータ構造体を発生するのにもＣＰＵ３０２が使用される場合には、バッファ３０４は、ＣＰＵ３０２の作用メモリの単なる一部分である。同様に、ＣＰＵ３０２は、エンコードされたデータ構造体を出力ファイルバッファ３０６に与え、該バッファは、ＣＰＵ３０２の作用メモリの一部であってもよいし、又は何らかの他の出力バッファであってこれを通してファイルを出力し使用するものであってもよい。
【０１０１】
ＣＰＵ３０２のプログラムメモリ３１０は、実行すべきプログラムを記憶している。このプログラムメモリ３１０は、説明上、図５の方法と同様に多数のサブルーチンを呼び出すメインエンコードルーチン３１２を含んでいる。図示したサブルーチンは、図６ないし９に関連して上記した機能に一般的に対応している。サブルーチン３１４は、ＦＳＭデータ構造体の状態ユニットに関する情報、例えば、入力ポインタの数及びコストを収集し、そして状態のコストを制限する機能を実行することができる。サブルーチン３１６は、ポインタサイズ及びポインタインデックスを適当な状態に割り当て、状態の種類に基づいてこのように行うことができる。サブルーチン３１８は、遷移ユニットを発生しそしてそれらに位置を割り当て、ポインタテーブルを完成できるようにする。サブルーチン３２０はファイルを書き込み、そしてサブルーチン３２２を呼び出して、図４と同様のバイト値マップに基づいて遷移ユニットに特定のバイト値を割り当てることができる。
【０１０２】
プログラムメモリ３１０のプログラムを実行する間に、ＣＰＵ３０２は、作用データメモリ３３０を使用して、データ構造体及びこれをエンコードするのに用いる他のデータを記憶する。作用データメモリ３３０は、説明上、一連の状態ユニット（ＳＵ）を備え、その各々の後には出力遷移から発生された出力遷移ユニット（ＴＵ）があり、そして更に、ポインタインデックステーブルのような一連のテーブルも備えている。プログラムの実行が完了すると、ＣＰＵ３０２は、エンコードされたデータ構造体を出力ファイルバッファ３０６へ送る。
【０１０３】
図１３のルックアップ装置３５０は、ＣＰＵ３５２を中心とすることにより図１２のエンコード装置３００に類似している。実際に、同じＣＰＵを両装置に使用できるが、実行すべき機能に対し異なったプログラムがなされる。ＣＰＵ３５２は、文字入力バッファ３５４を経て文字のストリング又はルックアップすべき他のエレメントを受け取り、この入力バッファは、受け取った文字ストリングを一時的に記憶するように構成された通常の入力バッファである。同様に、ＣＰＵ３５２は、受け取ったストリングをエンコードされたデータ構造体と一致し損なったときに欠陥信号出力３５６を経て欠陥信号を発生する。
【０１０４】
動作中に、ＣＰＵ３５２は、プログラムメモリ３６０に記憶されたプログラムを実行する。このプログラムメモリ３６０は、説明上、図１１の方法に対応するメインルックアップルーチン３６２を含み、このルーチン３６２は、多数のサブルーチンを呼び出すことができ、その幾つかの例を示す。サブルーチン３６４はエンコードされたデータ構造体内の位置をアクセスし、その位置に記憶されたバイトを検索する。サブルーチン３６６は、検索したバイトからのラベルを受け取った文字と比較して一致を見つける。サブルーチン３６８は、検索したバイトをテストし、その別のビット、最終ビット及びＥＯＢビットを決定する。他のサブルーチンは、他の機能を実行するようにメインルックアップルーチン３６２から分割することができる。
【０１０５】
プログラムメモリ３６０のプログラムを実行する間に、ＣＰＵ３５２は、図１３にエンコードされたＦＳＭメモリ３７０と示されたメモリの一部分にエンコードされたデータ構造体を保持する。更に、ルックアップ工程中にデータを一時的に記憶するため、ＣＰＵ３５２はその作用データメモリ３８０を使用する。一致が得られる限り、ＣＰＵ３５２は一連の受け取ったストリングの各々をルックアップし続け、一致しないストリング、ひいては、ＦＳＭに受け入れられないストリングを見つけたときにのみ欠陥信号を発生する。
【０１０６】
Ｆ．その他
本発明は種々様々な用途を有する。スペルチェックは、エンコードされたＦＳＭデータ構造体を用いて、受け取ったストリングを、カバーされたストリングの組に対してチェックする１つの応用例である。ハイフン接続、辞書、翻訳、光学文字認識、等を含む多数の他の応用例も当業者に明らかであろう。
【図面の簡単な説明】
【図１】１組のストリングを表す簡単なデータ構造体の一部分の状態及び遷移を示すグラフである。
【図２】図１のデータ構造体に対応する遷移ユニットのシーケンスを示す図である。
【図３】図２の遷移ユニットのシーケンスの圧縮した形態を示す図である。
【図４】バイトがとる値が、ラベル及び付加的な情報を含むある値と、ポインタデータユニットである他の値とをいかに含むかを示したバイトマップである。
【図５】ＦＳＭデータ構造体をエンコードする段階を示すフローチャートである。
【図６】図５に用いられるルーチンであって、データ構造体の各状態に対する入力ポインタをカウントしそして各状態のコストを制限するためのルーチンを示すフローチャートである。
【図７】図５に用いられるルーチンであって、ポインタサイズ及びインデックスをＦＳＭデータ構造体の状態に割り当てるルーチンを示すフローチャートである。
【図８】図５に用いられるルーチンであって、ＦＳＭデータ構造体の遷移ユニットに位置を割り当てるルーチンを示すフローチャートである。
【図９】図５に用いられるルーチンであって、テーブルと、バイト値が順に割り当てられた遷移ユニットとの両方を含むエンコードされたＦＳＭデータ構造体を備えたファイルを書き込むルーチンを示すフローチャートである。
【図１０】図９のルーチンに基づいて書き込まれたエンコードされたＦＳＭデータ構造体を含むファイルを示すメモリマップである。
【図１１】図１０のエンコードされたＦＳＭデータ構造体において受け取った文字ストリングをルックアップする方法を示すフローチャートである。
【図１２】エンコード装置を示すブロック図である。
【図１３】図１０のエンコードされたデータ構造体を含むルックアップ装置を示すブロック図である。
【符号の説明】
６０  スタート状態
６２、６６、７０、７２  最終状態
３００  エンコード装置
３０２  ＣＰＵ
３０４  ＦＳＭ入力バッファ
３０６  出力ファイルバッファ
３１０  プログラムメモリ
３３０  作用データメモリ
３５０  ルックアップ装置
３５２  ＣＰＵ
３５４  文字入力バッファ
３５６  欠陥信号出力
３６０  プログラムメモリ
３７０  エンコードされたＦＳＭメモリ
３８０  作用データメモリ
【図１】
0003722231.tif 000004
【図２】
0003722231.tif 000005
【図３】
0003722231.tif 000006
【図４】
0003722231.tif 000007
【図５】
0003722231.tif 000008
【図６】
0003722231.tif 000009
【図７】
0003722231.tif 000010
【図８】
0003722231.tif 000011
【図９】
0003722231.tif 000012
【図１０】
0003722231.tif 000013
【図１１】
0003722231.tif 000014
【図１２】
0003722231.tif 000015
【図１３】
0003722231.tif 000016