(57)【特許請求の範囲】
【請求項１】
指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソート方法であって、
各レコードの複数のソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けて前記複数のソートキー項目毎にオートマトンを生成するオートマトン作成処理段階と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた複数の順序値と一つの当該レコード識別子との組である複数順序値タプルを生成する順序値タプル生成段階と、
さらに、前記複数順序値タプルを複数順序値キー文字列として、前記複数順序値タプルに含まれる全タプルに対し前記オートマトンを生成し、該生成したオートマトンを走査することによって総合的なソートテーブルを生成するソートテーブル作成処理段階と、
を有することを特徴とするデータソート方法。
【請求項２】
指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソート装置であって、
各レコードの複数のソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けて前記複数のソートキー項目毎にオートマトンを生成するオートマトン作成処理手段と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた複数の順序値と一つの当該レコード識別子との組である複数順序値タプルを生成する順序値タプル生成手段と、
さらに、前記複数順序値タプルを複数順序値キー文字列として、前記複数順序値タプルに含まれる全タプルに対し前記オートマトンを生成し、該生成したオートマトンを走査することによって総合的なソートテーブルを生成するソートテーブル作成処理手段と、
を有することを特徴とするデータソート装置。
【請求項３】
指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソートプログラムであって、
各レコードの複数のソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けて前記複数のソートキー項目毎にオートマトンを生成するオートマトン作成処理段階と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた複数の順序値と一つの当該レコード識別子との組である複数順序値タプルを生成する順序値タプル生成段階と、
さらに、前記複数順序値タプルを複数順序値キー文字列として、前記複数順序値タプルに含まれる全タプルに対し前記オートマトンを生成し、該生成したオートマトンを走査することによって総合的なソートテーブルを生成するソートテーブル作成処理段階と、
をコンピュータに実行させることを特徴とするデータソートプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数項目からなるレコードが大量に集まった大量レコードデータを、着目する特定の項目をソートキー項目と指定して、各レコードのソートキー項目の値を比較してレコードを順序づけて分類するデータソート技術に係り、特に、ＣＳＶ形式のデータやＸＭＬ文書のようなテキスト形式データでレコード構造をもつ文字列データのデータソート技術に関する。
【０００２】
【従来の技術】
従来のデータソートの方法として、選択ソート、挿入ソート、バブルソート、シェルソート、クイックソート等の方法がある。これらの方法はソート単位であるレコードを１件ずつ比較してソートを行うため、同一レコードを何度も繰り返して読み出す必要があり、ソート処理に必要な時間はレコード件数の増加に従い級数的に増加する。一般にレコード件数をｎとすると、各方式でのソート時間は以下の数式で表される。
単純選択法：ｎ2 
クイックソート：ｎlog ｎ〜ｎ2 
挿入ソート：ｎ2 （大量件数の場合）
バブルソート：ｎ〜ｎ2 
シェルソート：ｎ1.5 〜ｎ1.25
【０００３】
【発明が解決しようとする課題】
このように従来のデータソート方法では大量レコードからなるデータをソートするための処理時間はレコード件数の増加に従い級数的に増加するので、データの保守性・運用性を著しく損なう、という課題があった。本発明はこのような課題を解決するために、同一レコードを一度読み出すだけで所望のソート順序値が得られるデータソートの方法、装置およびプログラムを提供することを目的とする。
【０００４】
【課題を解決するための手段】
上記課題は、図１に示す如く、各レコードのソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けたオートマトンを生成するオートマトン作成処理段階（ステップＳ１１１）と、前記オートマトンを走査して前記レコードを昇順または降順に順番付けた順序値と当該レコード識別子との組である順序値タプルを生成する順序値タプル生成段階（ステップＳ１１５）とを有するデータソート方法によって解決される。
【０００５】
すなわち、図２のように構成されたデータソート装置の場合、外部から指定されるキー条件kcを入力データd に適用する前段階を経て、ステップＳ１１１でオートマトン作成処理手段３は入力レコードを識別するレコード識別子rid をレコード識別子設定手段１から取得し、当該レコードの指定キーの値に対応するキー文字列k-str をキーデータ前処理手段２から取得する。
【０００６】
オートマトン作成処理手段３は入力されるすべてのレコードについて、このキー文字列k-str を受理するオートマトンamを生成する。オートマトンamはキー文字列k-str の文字数（可変長の場合はその最大桁数）分の階層をもつ状態遷移表の集合であり、これらの表は相互にリンクされ、図２中に示す如く、初期状態遷移表（００と表示）を根とするツリー構造を形成する。
【０００７】
本発明ではこのオートマトンamの各キー文字列k-str を受理する最終遷移状態を示す最終状態遷移表に当該レコード識別子を対応付けて記録するものである。従って、入力全レコードのレコード識別子rid がいずれかの状態遷移表に記録されている。
次いで、ソートテーブル作成処理手段４中の順序値タプル生成手段41は、ステップＳ１１５において、前記オートマトンamのツリーを根元から順序づけられた状態順に枝にそって深さ優先で走査して得られた状態遷移表に記録されたレコード識別子rid を取得する。この時、走査順序に従って順序値jvalが当該レコード識別子rid と対応付けられる。これによって順序値タプル生成手段41は順序値jvalと当該レコード識別子rid との組である順序値タプルj-tpl を生成する。
【０００８】
以上の順序値タプル生成段階は、指定ソートモードが昇順の場合、順序値jvalの最小値から生成されるので、例えば昇順で上位２０のレコードを求める場合、本順序値タプル生成段階を２０ループするだけで所望のレコードが求まる。先のステップＳ１１１のオートマトン作成処理段階で全レコードを一度読み込むだけでこのように所望のソート順序値が得られるので従来技術よりその処理スピードははるかに迅速である。
【０００９】
また、全レコードに関するソートを完成させる場合、ステップＳ１１５の順序値タプル生成段階を完遂し、全順序値タプルj-tpl を順序値jvalの昇順または降順に並べたソートテーブルであるソート順ソートテーブルs-stを作成すればよく、やはり従来技術よりその処理スピードははるかに迅速である。
入力キー条件kcで指定ソートキー項目が複数項目の場合、例えば第１優先キー、第２優先キー、... 、第K 優先キーが設定された場合は、オートマトンamはソートキー項目毎にK 個作成される。この場合、１レコード読み込む毎に、ステップＳ１１１のオートマトン作成処理段階はK 回ループし、K 個のオートマトンamを更新成長させる。また、全レコード読み込み終了後、ステップＳ１１５のソートテーブル作成処理段階もK 回ループしてK 個のオートマトンamを順次走査して、レコード識別子rid の昇順または降順に並べたソートテーブルであるレコード順ソートテーブルr-stを生成する。
【００１０】
このように生成したレコード順ソートテーブルr-stでは、各レコード毎にその第１優先キー順序値jval(1) 、第2 優先キー順序値jval(2) 、... 、第K 優先キー順序値jval(K) の複数順序値タプルが得られる。この複数順序値タプルを文字列とみなして、この文字列を複数順序値キー文字列として、レコード順ソートテーブルr-st中の全タプルに対して、オートマトン作成処理手段３にこれを与え、これを受理するオートマトンを生成し（ステップＳ１１１を適用）、このオートマトンをソートテーブル作成処理手段４に与えて走査する（ステップＳ１１５を適用）と、前記複数ソートキーに対する総合的な順番として新たに順番付けた総合順序値と当該レコード識別子との組である総合順序値タプルを生成する。従って、ステップＳ１１５は総合順序値タプル生成段階となる。ここで得られた総合順序値タプルから総合的なソート順ソートテーブルs-stが得られ、複数キーに対するデータソートが完成する。この場合も全レコードを一度読み込むだけで所望のソート順序値が得られるので、従来技術よりその処理スピードははるかに迅速である。
【００１１】
さらに、図１のステップＳ１４に示すように、入力データから読み出したレコード毎に、当該レコードの開始アドレスを当該レコードを識別するレコード識別子と対応付けたタプルを記録するレコード識別子設定段階を設けることで、データd 中に明示的なレコード識別子が存在しない場合でもレコード識別子rid を付与でき、本発明の適用範囲が広がる。
【００１２】
さらに、図１のステップＳ１９に示すように、指定されたソートキー項目毎のソート方法に関する条件であるキー条件kcに応じて、入力されたソートキー項目データを前記オートマトン作成処理に適するキー文字列k-str に変換するキーデータ前処理段階を設けることで、キーデータのデータ型や桁数をソートに適するように変換をし、ソート可能なデータd の範囲を広げることができる。
【００１３】
【発明の実施の形態】
本発明のデータソート方法の実施例を図１〜図９により説明する。なお、本発明におけるコンピュータ処理は、コンピュータプログラムにより当該コンピュータの主記憶装置上で実行されるが、このコンピュータプログラムの提供形態は、当該コンピュータに接続された補助記憶装置をはじめ、フロッピーディスクやＣＤ−ＲＯＭ等の可搬型記憶装置やネットワーク接続された他のコンピュータの主記憶装置及び補助記憶装置等の各記録媒体に格納されて提供されるもので、このコンピュータプログラムの実行に際しては、当該コンピュータの主記憶装置上にローディングされ実行されるものである。
【００１４】
最初に本発明の中心となるオートマトンの構造例について、図３の具体例によって説明する。既に図２のツリー図でオートマトンamを示したように、オートマトンamは複数の状態遷移表の集合で、キー文字列k-str を受理する状態遷移を写像するものである。すなわち、各ノードに状態遷移表を配し、ノード間のリンクをするアローがキー文字列k-str の各文字に対応する。一つの状態遷移表から次の状態遷移表へリンクするアローの数が状態遷移数である。オートマトンamではキー文字列k-str の一文字がとりうる値の種類に応じて状態遷移を行う。よってキー文字列k-str の一文字単位のビット列の長さによってオートマトンamの 1文字当りの状態遷移数が異なる。その事情を図３(a) で説明する。
【００１５】
図３(a) ではキー項目の値が文字列『富士通』の場合のキー文字列k-str の設定例を示した。本例ではこれらの日本語文字はＳＪＩＳコードで一文字 2バイト（16ビット）で文字数は３で、合計４８ビットのビット列である。キー文字列k-str の 1文字単位とみなすビット数（ 1文字単位ビット数）を１６とすると、第 1文字はｘ９５７８であり、１文字当り最大遷移状態数は６５５３６である。同様に、 1文字単位ビット数を８とすると、第 1文字はｘ９５であり、１文字当り最大遷移状態数は２５６であり、 1文字単位ビット数を４とすると、第 1文字はｘ９となり、１文字当り最大遷移状態数は１６である。このように受理するキー文字列k-str の 1文字単位ビット数によってオートマトンamの構造が異なる。本実施例ではキー文字列k-str の 1文字単位ビット数を４として以下の説明を行うが、本発明のキー項目の文字列を受理するオートマトンamがこれに限定されるものではない。
【００１６】
図３(b) にキー文字列k-str を 4ビット文字とする第p 文字受理状態遷移表tid(p)の構成例を示す。表ｉｄ欄は本表を識別する識別子であり、同時に本表へのアクセスアドレスxxxxを記録する。文字i 受理遷移先欄(i=0,1,...,F) は入力キー文字列k-str の第p 文字の内容がi であった場合に遷移する第p+1 文字状態遷移表tid(p+1)へのポインタである。図の例では文字0 受理遷移先欄にポインタtid(p+1)=yyyy を記入し、第p+1 文字状態遷移表tid(p+1)=yyyy にリンクすることを示している。また、文字1 受理遷移先はヌル("")であるが、これは本オートマトンamが第p 文字1 のキー文字列k-str を受理しないことを示す。( すなわち、本発明ではそのようなキー文字列k-str が存在しなかったことを含意する。)
遷移元表ｉｄ欄は本表に遷移する元の第p-1 文字状態遷移表tid(p-1)を示すポインタであり、図の例では wwww によって示される。なお、オートマトンamのツリーの根は初期状態遷移表tid(0)であるが、当然、初期状態遷移表tid(0)においては遷移元表ｉｄ欄はヌル("")となっている。
【００１７】
最終遷移状態フラグ欄は本表を最終遷移状態とするキー文字列k-str を持つレコードの存在を示すフラグである。本欄の値が０の場合、本表を最終遷移状態とするレコードはない。一方、本実施例では本最終遷移状態フラグを受理件数カウンタとしても利用する。すなわち、最終遷移状態フラグ欄の値はこの表を最終とするキー文字列k-str のレコード件数を示す。図の例では18件が本表を最終遷移状態として受理されている、すなわち、18件の異なるレコードがすべて同一のキー文字列k-str をもつことがわかる。
【００１８】
受理レコード識別子リスト欄は上記18件のレコードのレコード識別子rid のリストである。また、受理レコード補助情報欄は上記レコードの補助情報を受理レコード識別子リスト欄のリストに対応して持つ。補助情報とは、例えば当該レコードの開始アドレスやレコード長などの関連情報である。これらの情報は図５(d) に示すようなレコード識別子設定テーブルrid-t に基づいてとられる。
【００１９】
以上のオートマトンamを利用して、本発明のデータソート装置が動作する。図２は本発明のデータソート装置の構成の一例である。図２に示す如く、本データソート装置は外部からデータd およびキー条件kcが与えられ、動作を開始する。データd は多数のレコードからなるデータ集合であり、キー条件kcはこのデータd のレコードをソートするキーに関する条件を指定する。図４には入力されるデータd の構造とキー条件kc設定例を示す。これに基づいて、本発明の実施例を説明する。
【００２０】
図４(a) はデータd の構造例である。図の如く、データd はタグ文字列＜Ｒ−ＥＮＤ＞によってレコード構造をもつテキスト形式データで、さらにレコード内も不等号文字で囲まれたタグ文字列によって項目が識別され区切られている。図の例では一つのレコードは部コード、氏名、入社年度、売上の 4つの項目データからなっている。それぞれのレコードを識別するレコード識別子rid は本例ではデータ中には存在しない。図では最初のレコードをレコード識別子rid ＝１、次のレコードをレコード識別子rid ＝２、．．．とし、最終レコードはレコード識別子rid ＝Rmaxで合計Rmax件のレコードからなっている。
【００２１】
図４(b) にはキー条件kcの設定例を示す。キー条件kcはキー優先順位、キー項目名、ソートモード、データ型、最大文字数を設定するものである。キー優先順位は複数キーを設定する場合の各キーに与える優先順位である。図の例では 3つのキー項目＜売上＞＜入社年度＞＜部コード＞がこの順の優先順位で設定されている。ソートモードは昇順／降順を指定する。例では＜売上＞を降順指定し、他は昇順としている。
【００２２】
データ型は数値型と文字列型とがある。文字列型は項目データを文字列として扱うことを指定しており単純である。すなわち、キー文字列k-str は項目データを構成するビット列を4 ビットずつ区切って1 文字と数えるだけでよい。例えば図４(c) の文字列"-123.456"はこれを文字列と指定するとキー文字列k-str は16文字からなるx2D3132332E343536 となる。
【００２３】
これに対し数値型指定は項目データの文字列が数値を表すこと、かつ、ソートに際してはこれを数値として比較することを要求する。従って、キーデータ前処理手段２は該当項目データの文字列が意味する数値を解釈してこれを相互比較可能な標準形文字列であるキー文字列k-str に変換する。数値にはゼロサプレス、小数点、正負符号、仮数指数表現、スペース挿入、全角半角混在などの表現のばらつきがあるので、キーデータ前処理手段２はこれらを解釈して標準の内部文字列に変換する。
【００２４】
数値型の内部文字列変換仕様は本実施例では 4バイト（３２ビット）の浮動小数点形式であり、符号部 1ビット、指数部は指数符号部 1ビット指数絶対値 7ビットの計８ビット、仮数部は仮数整数値を23ビットでとり、符号部、指数符号部とも負＝0 、正＝1 とする。例えば図４(c) の文字列"-123.456"はこれを数値型と指定するとキー文字列k-str は８文字からなるx4181E240 となる。これは通常のＡＮＳＩ／ＩＥＥＥ規格７５４の浮動小数点形式とは異なるが、この 4バイト8 文字のキー文字列k-str のビット並びが数値としての大小関係を反映するよう考慮したものである。
【００２５】
また、キー条件kcとして最大文字数を設定すると、当該キー項目データが最大文字数を越える場合に、越えた文字列を無視してソートを行うことを指定する。ここでいう最大文字数はデータとしての文字数でありキー文字列k-str の文字数ではない。以上、キー条件kcの各設定はキー項目名を除いてそれぞれデフォルト設定があり、入力によってこれを変更するものとする。
【００２６】
以上でのキー文字列k-str の構造およびそれを受理するオートマトンamの構造を説明したが、本発明のデータソート装置の動作説明の前に、ソートテーブルについて予備説明を行う。本発明のデータソート装置は後述するように、個々のレコード識別子rid と当該レコードのソート結果の順序を示す順序値jvalとの組である順序値タプルj-tpl を次々につくり出し、これをソートテーブルの形で蓄積していく。図６にソートテーブルのデータ構造例を示すように、本発明ではソート順ソートテーブルs-stとレコード順ソートテーブルr-stの 2種類のソートテーブルをもつ。
【００２７】
図６(a) は順序値タプルj-tpl の構造を示す。順序値jvalはソート指定キーが複数の場合にはキー毎に生成されるので複数順序値タプルとも呼ぶ。キー条件kcによって第k 優先キーと決められたキーでの順序値jval(k)(k=1,2,...,K)の組が一つのレコード識別子rid と対応するので図６(a) のような順序値タプルj-tpl となる。これを特定の順序値jvalに注目して順序値jvalの昇順に蓄積したものが図６(b) に示すソート順ソートテーブルs-stである。図に示すように一般に順序値jvalは同一値を複数レコード識別子rid に対応させることができる。すなわち、同一順序( 順序をつけられない) のレコードが複数個出現する。
【００２８】
図６(c) はレコード順ソートテーブルr-stの構造例である。これは図６(a) の複数順序値タプルをレコード識別子rid の値の昇順に蓄積したテーブルである。なお、本実施例では図のように各レコード識別子rid 行にキー毎の順序値jval欄の他にキー欠落フラグ欄を設ける構造とした。キー欠落とは当該レコードの指定キーを探索した場合に指定キー項目が存在しなかった場合、または存在するがその項目データがヌル値であった場合をいう。後述するように、本発明のデータソート装置ではキー欠落を検査して発見すると、このレコード順ソートテーブルr-stの該当キー欠落フラグを立てる。図６(c) ではレコード識別子rid ＝３の第１優先キー、レコード識別子rid ＝６の第２優先キーなどにキー欠落フラグが立てられている。
【００２９】
キー欠落時の対処には種々のインプリメントがあるが、本実施例ではそのようなレコードは該当キーの順序値jvalが最大であるとする。すなわち、昇順、降順にかかわらずこれらのレコードは最下位にソートされるものとした。図６(c) ではこの最下位の順序値jvalをmax(k)と表しているが、その値は後述するように順序値タプル生成段階で決定される。
【００３０】
以上の準備を踏まえて、本発明のデータソート装置の動作を図１、５、７、８、９の動作フローに従って説明する。図１は本発明のデータソート方法の動作フロー例である。ステップＳ１１は初期設定段階であり、図５(a) にその詳細動作を示す。
まず、レコード識別子設定手段１は図５(d) に示すレコード識別子設定テーブルrid-t の領域設定を行う。次いでレコード識別子設定手段１は既読レコード数変数rrをリセットする。(rr ←0)。本既読レコード数変数rrは、後述のレコード識別子設定段階（ステップＳ１４）でレコード識別子設定手段１が各レコード読み込み時に対応するレコード識別子rid を発行する拠り所となるものである。キーデータ前処理手段２はキー条件kcを読み込み格納する。次いで、レコード識別子設定手段１はキーデータ前処理手段２からキー項目数を得て、先に図６で説明したレコード順ソートテーブルr-stの領域設定を行い、また、ソート順ソートテーブルs-stの領域設定を行う。ここでは、単にこれらの領域を確保するのみでその値はすべてヌルクリアされている。次いでレコード識別子設定手段１は第k 優先キー初期状態遷移表tid-k(0)(k=1,2,...,K) を作成する。図４(b) のように 3個のキーが設定された場合はK=3 で、第1 優先キー初期状態遷移表tid-1(0)= iiii(1) 、第2 優先キー初期状態遷移表tid-2(0)= iiii(2) 、第3 優先キー初期状態遷移表tid-3(0)= iiii(3) が生成される。 iiii(k)は各初期状態遷移表tid-k(0)のアドレスでかつ表ｉｄである。
【００３１】
次いで、データソート装置の共通制御部（図２には図示せず）は図１のステップＳ１２でデータd の１レコードを読み込む。ステップＳ１３でファイル終了でなければステップＳ１４でレコード識別子設定段階の動作を行う。ここでは図５(b) に示すように、まず、既読レコード数変数rrをインクリメントし (rr←[rr]+1) 、これを図５(d) のレコード識別子設定テーブルrid-t のレコード識別子rid 欄に設定し（レコード識別子rid ←[rr]）、開始アドレスオフセット値、レコード長の設定を行う。なお、このレコード識別子設定テーブルrid-t は、レコード識別子rid によって該当レコードをダイレクトアクセスするためのインデクスとして使用されるものである。
【００３２】
これによって当該レコードに対するレコード識別子rid の設定ができたので、次いで、先に領域設定されたレコード順ソートテーブルr-stの所定行にこのレコード識別子rid ←[rr]を登録する。
次いで、ステップＳ１５、１６、１７は第k 優先キー(k=1,2,...,K) の処理に移行するループ制御である。ステップＳ１８ではキーデータ前処理手段２は当該レコードに当該第k 優先キーが存在するか、またそのキーデータがヌル値でないかを検査し、キー欠落でなければステップＳ１９でキーデータ前処理を行う。この処理は先に図４(c) で述べたように、当該第k 優先キーのキー条件kcに基づいて、キーデータをキー文字列k-str に変換するものである。またステップＳ１８でキー欠落と判定の場合はステップＳ１１０に移行し図５(c) に示すキー欠落処理段階の動作を行う。
【００３３】
図５(c) によってこれを示すと、まず、キーデータ前処理手段２は図６(c) のレコード順ソートテーブルr-stの当該レコード識別子rid の行の第k 優先キー欠落フラグを立てる。次いで、第k 優先キー初期状態遷移表tid-k(0)の最終遷移状態フラグ欄を1 加算し、受理レコード識別子リスト欄に当該レコード識別子rid をアペンドする。すなわち、キー欠落レコードは当該キーのオートマトンamの初期状態遷移表tid-k(0)の受理レコード識別子リスト欄に記入することによって分類される。
【００３４】
図１に戻り、正常にキー文字列k-str が取得できた場合はステップＳ１１１に達し、ここでオートマトン作成処理手段３は図７に示す第k 優先キー対応のオートマトンamの更新を行う。図７には現在のオートマトンamが新たにキー文字列k-str ＝c(1),c(2),...,c(C)を受理するように更新される動作例を示す。
まずステップＳ７１でオートマトン作成処理手段３は第k 優先キーのキー文字列k-str の文字を取り出す文字ポインタcpをリセットし、第k 優先キーのオートマトンamから状態遷移表を取り出す表ポインタtpをオートマトンamの根（すなわち、初期状態遷移表tid-k(0)) にポイントする。
【００３５】
次いでステップＳ７２、７３によって文字ポインタcpを一つ進め最終文字に達するまでループ制御する。第cp文字c(cp) が存在するときはステップＳ７４に、全文字終了時はステップＳ７９に分岐する。
ステップＳ７４ではオートマトン作成処理手段３は当該文字c(cp) のコード[c(cp)]=i を調べ、当該状態遷移表tpの文字ｉ受理遷移先欄がヌルかを検査する。ヌルであった場合はまだかつて受理されていないキー文字列k-str であるのでステップＳ７５で対応する新たな状態遷移表を生成する。すなわち、オートマトン作成処理手段３は新しい状態遷移表生成アドレス=aaaa を取得し、第cp文字状態遷移表tid-k(cp) を生成し、その表ｉｄ欄にtid-k(cp)=aaaaを記入する。また、その遷移元表ｉｄ欄に元の状態遷移表ポインタ値[tp]を記入する。また、これと対応して、ステップＳ７６で遷移元表( 表ｉｄ[tp]=tid-k([cp]-1)の表) の文字[c(cp)] 受理遷移先欄に値tid-k(cp)=aaaaを記入する。これはステップＳ７４で検査してヌルであった[tp ｛文字[c(cp)] 受理遷移先｝] を値aaaaと書き換えることに他ならない。
【００３６】
かくして、キー文字列k-str の第c(cp) 文字まで受理したので、次の文字を検査すべくステップＳ７７において、表ポインタtpをステップＳ７５で生成した状態遷移表へと進める。一方、ステップＳ７４で[tp ｛文字[c(cp)] 受理遷移先｝] がヌルでなかった場合は既にこの文字を受理した状態遷移表が存在し、その状態遷移表のアドレスが得られているので、オートマトン作成処理手段３はステップＳ７８でこれを新たに表ポインタtpとして設定する。
【００３７】
ステップＳ７７またはステップＳ７８で表ポインタtpを次文字用に設定し、ステップＳ７２に戻り文字ポインタcpを一つ進めて次の文字に対処する。全文字終了時にステップＳ７９に到達する。この時点での表ポインタtpの値tid-k(C)で示す状態遷移表は当該キー文字列k-str を受理する最終遷移状態を示している。よってオートマトン作成処理手段３はステップＳ７９でこの表tpの最終遷移状態フラグ欄を1 加算し、受理レコード識別子リスト欄に値[rr]（すなわち、当該受理キー文字列k-str をキーデータとするレコードのレコード識別子rid ）をアペンドする。また受理レコード補助情報欄に関連設定を行う。
【００３８】
図１に戻り、ステップＳ１１１の第k 優先キー対応オートマトン作成処理段階を終えるとステップＳ１６に戻り次の第k+1 優先キーに対応するオートマトンamについて同様処理を行う。かくして当該１レコード中の複数キーの全部に対してK 個のオートマトンamの作成更新が終了すると、ステップＳ１７でループを外れ、ステップＳ１２に戻りデータソート装置の共通制御部はデータd の次の１レコードを読み込む。
【００３９】
このように、すべてのレコードを読み、これに対応するレコード識別子設定、オートマトンam更新を終え、ファイル終了を検出すると、データソート装置の共通制御部はステップＳ１１２に移り、これまで生成更新したオートマトンamを走査する段階に至る。ステップＳ１１２〜１１４は第k 優先キー毎のループ制御を行い、ステップＳ１１５でソートテーブル作成処理手段４は当該第k 優先キー対応の順序値タプル生成およびソートテーブル生成を行う。その動作を図８によって以下に説明する。
【００４０】
図８のステップＳ８１は順序値タプル生成の初期設定で、先に説明したキー欠落レコードを同定する。すなわち、ソートテーブル作成処理手段４の順序値タプル生成手段41は表ポインタtpを第k 優先キーオートマトンamの初期状態遷移表tid-k(0)=iiii(k)に設定し（tp←tid-k(0)）、コードインデックスcodeを0 とする(code ←0)。( コードインデックスcodeについては後述する。) そして初期状態遷移表tid-k(0)=iiii(k)の最終遷移状態フラグ欄の値を同位値カウンタscountに設定する（同位値カウンタscount←  [tp ｛最終遷移状態フラグ｝] ）。これによって第k 優先キー欠落レコードが[scount]件あることがわかる。一方、既読レコード数変数rrの値は全レコード件数Rmaxを示しているはずである。よって[rr]-[scount]=Rmax-[scount] 件のレコードを走査対象とするのであるから、すべてのキー欠落レコードの順序値jvalは最下位値 Rmax -[scount]+1 が与えられるべきである。
【００４１】
順序値タプル生成手段41は順序値タプルj-tpl を生成するために、レコード識別子ワークridwk および順序値ワークjvalwkからなる領域順序値タプルワークj-tplwk を用いる。ステップＳ８１では上記のキー欠落レコードの順序値jvalである Rmax -[scount]+1 を順序値ワークjvalwkに設定する( 図８ステップＳ81のjvalwk=max(k) ← Rmax -[scount]+1 ) 。同時に、この値が先に図６(c) で説明したmax(k)でもあるので、ステップＳ８２〜８４において順序値タプル生成手段41はレコード順ソートテーブルr-st上およびソート順ソートテーブルs-st上の該当位置にもこの値を設定する。ステップＳ８３では初期状態遷移表tid-k(0)=iiii(k)の受理レコード識別子リスト欄のリスト要素（[scount]件ある) を順に取り出してレコード識別子ワークridwk に代入して順序値タプルワークj-tplwk を完成している。
【００４２】
以上によってキー欠落レコードに対する順序値jvalの設定が完了したので、順序値タプル生成手段41は次にステップＳ８５以降で第k 優先キーオートマトンamを走査して、各レコード識別子rid に第k 優先キーの順序値jvalを対応付ける。このとき、順序値タプル生成手段41がステップＳ８５以降でとる戦略は以下のようなものである。すなわち、まず、順序値jvalを与えるインデックス変数として順序値インデックスjindを使用する。最初に順序値インデックスjindを初期値に設定しておいて、オートマトンamの第k 優先キー初期状態遷移表tid-k(0)から出発してすべてのリンクする状態遷移表を走査する。このときアクセスする状態遷移表を一つ進める毎に順序値インデックスjindをソートモードの昇順／降順に応じて調整設定し、該当の状態遷移表の受理レコード識別子リスト欄のレコード識別子rid にその順序値インデックスjind値を順序値jvalとして対応付けるのである。この戦略から明らかなように、順序値タプル生成手段41の状態遷移表アクセス順序が第k 優先キー文字列k-str のソート順序に対応するようなアクセス順序でなければならない。
【００４３】
キー文字列k-str の昇順で状態遷移表をアクセスする順序について考えると、まず、第 1文字c(1)の値が最小すなわちコード0 のキー文字列k-str に対応する状態遷移表を選ぶ。これは第k 優先キー初期状態遷移表tid-k(0)の文字0 受理遷移先欄のポインタが示す第1 文字状態遷移表tid-k(1)である。もしもこの第1 文字状態遷移表tid-k(1)の最終遷移状態フラグ欄が1 以上であるなら、それはキー文字列k-str がコード0 の1 文字であるレコードがあることを意味する。( 先に説明したようにここでいう文字はキー文字列k-str の文字単位、本実施例では4 ビット、であり、実際の文字コード体系での文字の割りあての有無についてはここでは問わない。) このようにして最上位の順序値jvalがこの第1 文字状態遷移表tid-k(1)の受理レコード識別子リスト欄に記入されたリスト要素の各レコード識別子rid に対応付けられる。その件数分順序値インデックスjind値を増やして次の順序値jvalを用意して、次はこの第1 文字状態遷移表tid-k(1)の文字0 受理遷移先欄に書かれた第2 文字状態遷移表tid-k(2)にアクセスする。
【００４４】
このように順序値タプル生成手段41はオートマトンamのツリー構造を深さ優先でたどり、また、文字0 受理遷移先欄から文字F 受理遷移先欄の最大16個の枝についてはこの順序で走査を進める。状態遷移表を深さ優先でたどるために表ポインタtpを用いるが、分岐枝を文字0 受理遷移先欄から文字F 受理遷移先欄へたどるためにステップＳ８１で設定したコードインデックスcodeを使用する。あるノードtpの状態遷移表の分岐枝code( すなわち文字[code]受理遷移先欄) から出発して深さ優先の走査処理を終えると、またこのノードtpの状態遷移表の分岐枝codeに戻って次の枝に走査を移すバックトラック制御が必要である。これを実現するために、順序値タプル生成手段41は走査のバックトラック用に、表ポインタtpとコードインデックスcodeとの組をスタックするバックトラック用スタックを用いる。本スタックはlast-in-first-out 型のスタックであって、ポップ命令によって、最後にプッシュされた値が読み出される構造である。
【００４５】
以上の戦略を実現する動作フローを図８のステップＳ８５以降で示す。ステップＳ８５では、順序値タプル生成手段41は順序値jvalを与える順序値インデックスjindを初期設定するが、その値は当該第k 優先キーのソートモードの昇順／降順によって異なる。既に述べた戦略で走査すると昇順走査であるのでソートモードが昇順の場合には順序値インデックスjindは初期値０からインクリメントするが、ソートモードが降順の場合は順序値インデックスjindは最下位値[max(k)]を初期値としてデクリメントする。
【００４６】
先にステップＳ８１で表ポインタtpは第k 優先キー初期状態遷移表tid-k(0)を指し、コードインデックスcodeは0 を指しているので、はじめてステップＳ８６にはいった時点ではオートマトンamツリーのルートノードの文字[code]受理遷移先欄を出発点とする。一般には第cp-1文字状態遷移表tid-k(cp-1) ノードの文字[code]受理遷移先欄を指定してステップＳ８６に到達する。コードインデックスcodeがx10 に達していない場合、すなわち、コードインデックスcodeが値０〜F である場合、ステップＳ８７で当該状態遷移表の文字[code]受理遷移先欄に次リンク先があるかを検査し、ない場合はステップＳ８８でコードインデックスcodeをインクリメントする。ステップＳ８７でリンク先があった場合、順序値タプル生成手段41はステップＳ８９でまず現在の表ポインタtp、コードインデックスcodeをバックトラック用スタックにプッシュし、ステップＳ８１０で該当のリンク先すなわち、[tp ｛文字[code]受理遷移先｝] を新たに表ポインタtpに設定してステップＳ８１１の順序値タプル生成・ソートテーブル作成ルーチンに分岐する。このルーチンについては図９で後述する。
【００４７】
ステップＳ８１１で目的の順序値タプルj-tpl やソートテーブルの作成更新を終えると、その状態遷移表について、分岐枝をたどるべくステップＳ８８でコードインデックスcodeをインクリメントし再びステップＳ８６の未処理枝有無判定に入る。コードインデックスcodeがx10 に達した場合はこれ以上分岐枝がないので当該状態遷移表での処理終了となりステップＳ８１２でバックトラック用スタックから次の分岐先をポップする。これによって最後にプッシュされた表ポインタtpとコードインデックスcodeの位置を取り出すことができる。
【００４８】
ステップＳ８１３はポップされた表ポインタtpがないこと、すなわち最終スタックを処理し終えて、全バックトラックが終了したことを検査して、ｙｅｓならば全処理終了となる。ポップされた表ポインタtpとコードインデックスcodeが存在する時は、順序値タプル生成手段41はステップＳ８１４でこれをもとにこの状態遷移表の次の分岐枝に進む、すなわち、ステップＳ８８に戻り処理を継続する。
【００４９】
最後にステップＳ８１１において順序値タプルj-tpl を取得し、ソートテーブルを更新する動作を図９によって説明する。本順序値タプルj-tpl 生成・ソートテーブル生成ルーチンは入力として、順序値インデックスjind  、ソートモードフラグsm(k) および表ポインタtpを与えてコールし、出力として順序値タプルj-tpl ( 順序値タプルワークj-tplwk として与える) の他、図６(c) に示すレコード順ソートテーブルr-stの該当レコード識別子rid 行を更新する。また、必要に応じて図６(b) のソート順ソートテーブルs-stを生成する。例えばK=1 すなわちキーの数が1 個の場合はソート順ソートテーブルs-stを作成すれば目的のソートを実行したことになる。この際にはレコード順ソートテーブルr-stの作成を省くことも可能である。また、本ルーチンは入力の順序値インデックスjindを用いて所定の順序値jvalを発行し、最後に順序値インデックスjindを更新して出力し、次の走査に供する。
【００５０】
図９のステップＳ９１は指定された状態遷移表tpの最終遷移状態フラグ欄を参照して順序値jvalを発行すべきレコード識別子rid の件数を知り、これを同位値カウンタscountにセットする。そしてソートモードフラグsm(k) が昇順の場合は順序値インデックスjind値+1から順序値jvalを発行すべきなので、順序値ワークjvalwkに順序値インデックスjind値+1をセットする。一方、ソートモードフラグsm(k) が降順の場合は、[scount]件分に対して同一の順序値jvalを発行してその次の下位が現在の順序値インデックスjind値になるべきであるので、発行すべき順序値jvalの値は[jind]-[scount] となり、順序値ワークjvalwkには[jind]-[scount] をセットする。
【００５１】
次いで順序値タプル生成手段41はステップＳ９２〜９４で[scount]件分のループ制御を行い、ステップＳ９５で順序値ワークjvalwkに対応すべきレコード識別子ワークridwk を取得する。すなわち、状態遷移表tpの受理レコード識別子リスト欄には対応すべき[scount]件分のレコード識別子rid を要素とするリストが書かれてあるので、これらすべてのレコード識別子rid に同一の順序値ワークjvalwkが対応する。かくしてレコード識別子ワークridwk に該当のレコード識別子rid を設定して順序値タプルワークj-tplwk (ridwk,jvalwk)を生成する。同時に、レコード順ソートテーブルr-st上の該当するレコード識別子rid 行の第k 優先キー順序値jval列のセルに順序値ワークjvalwkの値を転記する。これによってレコード順ソートテーブルr-stの更新が行われた。また、K=1 すなわち、ソートキーが1 個の場合は、上記レコード順ソートテーブルr-stに加え、ソート順ソートテーブルs-st上にも(ridwk,jvalwk)を転記することにより目的のソートを実行したことになる。すなわち、キーが一つで昇順指定であれば、図８の順序値タプル生成動作実行に従い、ソート順ソートテーブルs-stは順序値jvalの上位順に埋まって行くので、オートマトンamの全状態遷移表を走査し終えなくとも、上位20位までのレコード識別子rid を得る、などの用途では、上記ソート順ソートテーブルs-stの更新中途段階で十分ソートの目的が達成されたことになるので、従来技術のデータソートに比べ一層高速のレスポンスを得ることになる。
【００５２】
以上で順序値タプル生成、ソートテーブル作成更新を終えると、最後に次の処理に備えてステップ９６で順序値インデックスjindを更新する。[scount]件分の処理を行ったので、ソートモードフラグsm(k) が昇順の場合は順序値インデックスjind値は[jind]+[scount] に、降順の場合は[jind]-[scount] に更新する。  以上、本実施例ではK 個のソートキーが指定された場合に図６(c) のレコード順ソートテーブルr-stが形成される動作について述べた。各レコード識別子rid に対応して第1 優先キー順序値jvalから第K 優先キー順序値jvalまでのすべてのセルが順序値jvalで埋められている。本レコード順ソートテーブルr-stから総合的な順序値、すなわち、第1 優先キー順序値jvalが等しいレコード識別子rid 間では第2 優先キー順序値jvalの昇順に、第1 〜第２優先キー順序値jvalまでが等しいレコード識別子rid 間では第3 優先キー順序値jvalの昇順に、...,第1 〜第K-1 優先キー順序値jvalまでが等しいレコード識別子rid 間では第K 優先キー順序値jvalの昇順に全レコード識別子rid を順序づける総合順序値を与える必要がある。この総合順序値と当該レコード識別子との組である総合順序値タプルを生成する総合順序値タプル生成段階について以下に述べる。
【００５３】
本段階は図２のデータソート装置において、データd として、上述の作成されたレコード順ソートテーブルr-stそのものを与えることにより行われる。すなわち、図６(c) のレコード順ソートテーブルr-stの各レコード識別子rid は( 第1 優先キー順序値jval, 第2 優先キー順序値jval,..., 第K 優先キー順序値jval) の複数順序値の列をもっているので、この複数順序値の列を一つの文字列に置き換えて、これを当該レコード識別子に属する文字列とみなし、この文字列を複数順序値キー文字列fjk として前記レコード順ソートテーブル中の全タプルに対して、図２のデータソート装置に与えて動作させる。この複数順序値キー文字列fjk の昇順に総合順序値が順序付けられる。従って、本データソート装置の動作でキー数1 でキー項目が複数順序値キー文字列fjk の場合のステップＳ９５の動作で得られたソート順ソートテーブルs-stは総合順序値順にレコード識別子rid を並べたテーブルとなり所期の結果が得られる。
【００５４】
（付記１）  指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソート方法であって、
各レコードのソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けたオートマトンを生成するオートマトン作成処理段階と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた順序値と当該レコード識別子との組である順序値タプルを生成する順序値タプル生成段階と、
を有することを特徴とするデータソート方法。
【００５５】
（付記２）  指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソート装置であって、
各レコードのソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けたオートマトンを生成するオートマトン作成処理手段と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた順序値と当該レコード識別子との組である順序値タプルを生成する順序値タプル生成手段と、
を有することを特徴とするデータソート装置。
【００５６】
（付記３）  指定されたソートキー項目に従ってレコードを昇順または降順に並べ替えるデータソートをコンピュータに実行させるためのデータソートプログラムであって、
各レコードのソートキー項目の文字列を受理するオートマトンで、かつその最終遷移状態に当該レコード識別子を対応付けたオートマトンを生成するオートマトン作成処理段階と、
前記オートマトンを走査して前記レコードを昇順または降順に順番付けた順序値と当該レコード識別子との組である順序値タプルを生成する順序値タプル生成段階と、
をコンピュータに実行させることを特徴とするデータソートプログラム。
【００５７】
（付記４）  付記３記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
（付記５）  前記ソートキー項目は複数項目であり、前記順序値タプルは複数の順序値と一つのレコード識別子との組であることを特徴とする付記１記載のデータソート方法。
【００５８】
（付記６）  さらに、前記順序値タプルを所定の順に並べたソートテーブルを生成するソートテーブル生成段階を有することを特徴とする付記１または付記５記載のデータソート方法。
（付記７）  前記ソートテーブル生成段階において、順序値の昇順または降順に並べたソートテーブルであるソート順ソートテーブルを生成することを特徴とする付記６記載のデータソート方法。
【００５９】
（付記８）  前記ソートテーブル生成段階において、レコード識別子の昇順または降順に並べたソートテーブルであるレコード順ソートテーブルを生成することを特徴とする付記６記載のデータソート方法。
（付記９）  ソートキー項目は複数項目であり、複数の順序値と一つのレコード識別子との組である複数順序値タプルに基づいて、レコード順ソートテーブルを生成する付記８記載のデータソート方法であって、さらに、
前記レコード順ソートテーブルの複数順序値の列を当該レコード識別子に属する文字列とみなし、この文字列を複数順序値キー文字列として前記レコード順ソートテーブル中の全タプルに対してこれを受理するオートマトンを生成するオートマトン作成処理段階と、
前記オートマトンを走査して、前記複数ソートキーに対する総合的な順番として新たに順番付けた総合順序値と当該レコード識別子との組である総合順序値タプルを生成する総合順序値タプル生成段階と、
を有することを特徴とする付記８記載のデータソート方法。
【００６０】
（付記１０）  入力データから読み出したレコード毎に、当該レコードの開始アドレスを当該レコードを識別するレコード識別子と対応付けたタプルを記録するレコード識別子設定段階、をさらに有することを特徴とする付記１記載のデータソート方法。
（付記１１）  指定されたソートキー項目毎のソート方法に関する条件であるキー条件に応じて、入力されたソートキー項目データを前記オートマトン作成処理に適するキー文字列に変換するキーデータ前処理段階、をさらに有することを特徴とする付記１記載のデータソート方法。
【００６１】
【発明の効果】
以上の説明から明らかなように、本発明によれば、各レコードのソートキー項目の文字列を受理するオートマトンを生成し、その最終遷移状態に当該レコード識別子を対応付け、このオートマトンを走査することにより、従来のデータソート方法より高速なデータソートが可能となる、という効果がある。
【図面の簡単な説明】
【図１】本発明のデータソート方法の動作フロー例
【図２】本発明のデータソート装置の機能ブロック図
【図３】状態遷移表によるオートマトン生成例
【図４】入力されるデータd の構造とキー条件kc設定例
【図５】オートマトンam生成準備の各段階の動作例とレコード識別子設定テーブルrid-t
【図６】ソートテーブルのデータ構造例
【図７】オートマトン作成処理段階の動作フロー例
【図８】ソートテーブル作成処理段階の動作フロー例
【図９】順序値タプルj-tpl 生成・ソートテーブル生成ルーチンの動作例
【符号の説明】
１  レコード識別子設定手段
２  キーデータ前処理手段
３  オートマトン作成処理手段
４  ソートテーブル作成処理手段
41  順序値タプル生成手段
k-str キー文字列
kc    キー条件
am    オートマトン
tid(0)  初期状態遷移表
tid(p)  第p 文字状態遷移表
j-tpl   順序値タプル
rid     レコード識別子
jval    順序値
s-st    ソート順ソートテーブル
r-st    レコード順ソートテーブル
rid-t   レコード識別子設定テーブル
tp      表ポインタ
cp      文字ポインタ
scount  同位値カウンタ
code    コードインデックス
rr      既読レコード数変数
【図１】
0003772704.tif 000002
【図２】
0003772704.tif 000003
【図３】
0003772704.tif 000004
【図４】
0003772704.tif 000005
【図５】
0003772704.tif 000006
【図６】
0003772704.tif 000007
【図７】
0003772704.tif 000008
【図８】
0003772704.tif 000009
【図９】
0003772704.tif 000010