以下に、本願の開示するトライ木分類プログラムおよびトライ木分類方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
本実施例2にかかるデータ処理装置の説明を行う前に、トライ木について説明する。トライ木に含まれる各ノードは、トライ木内の位置や他のノードとの関係から各種の名称で定義される。図2は、一例として、図2に示すトライ木は、ノード1〜13を有しているものとする。また、ここでは説明の便宜上、ノード6を基準ノードとする。ノード1〜5,7〜13は、トライ木内の位置や基準ノードとの関係から、ルートノードまたは親ノード、先祖ノード、兄ノード、弟ノード、子ノード、子孫ノードと呼ばれる。
ルートノードは、トライ木を構成する各ノード1〜13のうち、最上層に位置するノードを示す。図2に示す例では、ノード1がルートノードに該当する。親ノードは、基準ノードのひとつ上の層に存在し、基準ノードに接続されたノードを示す。図2に示す例では、ノード3が親ノードに該当する。先祖ノードは、ルートノードから親ノードに至るまでのノードを示す。図2に示す例では、ノード1〜3が先祖ノードに該当する。
兄ノードは、基準ノードと同じ層に存在し、基準ノードと同じ親ノードに接続され、基準ノードの上側に存在するノードを示す。図2に示す例では、ノード4、5が兄ノードに該当する。また、ノード4,5のうち、ノード4は長男ノードと呼ばれる。弟ノードは、基準ノードと同じ層に存在し、基準ノードと同じ親に接続され、基準ノードの下側に存在するノードを示す。図2に示す例では、ノード7,8が弟ノードに該当する。
子ノードは、基準ノードのひとつ下の層に存在し、基準ノードに接続されたノードを示す。図2に示す例では、ノード9,10が子ノードに該当する。子孫ノードは、基準ノードの配下に存在するノードを示す。図2に示す例では、ノード9〜13が子孫ノードに該当する。
次に、本実施例2にかかるデータ処理装置の構成の一例について説明する。図3は、本実施例2にかかるデータ処理装置の構成を示す図である。図3に示すように、このデータ処理装置200は、入力部210、出力部220、入出力制御部230、記憶部240、制御部250を有する。
このうち、入力部210は、トライ木データに登録する入力キー等のデータを入力する入力装置である。例えば、入力部210は、キーボードやマウス等に該当する。出力部220は、トライ木データを用いた処理の結果などを出力する出力装置である。出力部220は、ディスプレイやモニタ、タッチパネルなどに対応する。入出力制御部230は、入力部210および出力部220、記憶部240、制御部250によるデータの入出力を制御する処理部である。
記憶部240は、制御部250による各種処理に必要なデータおよびプログラムを記憶する記憶部である。図3に示すように、この記憶部240は、入力キー管理テーブル240aおよびトライ木データ240b、出力結果データ240cを記憶する。
このうち、入力キー管理テーブル240aは、トライ木データ240bに登録する複数の文字列と文字列に対応する値とを対応付けて記憶するテーブルである。トライ木データ240bは、複数のノードが木構造状に接続されたデータである。このトライ木データ240bに含まれるノードは、区切文字を含む所定の文字列に対応付けられる。また、このトライ木データ240bのノードは、所定の値が設定される。出力結果データ240cは、トライ木データ240bの各ノードに設定された値を、所定の文字列毎に集計した値を含むデータである。
制御部250は、トライ木データ240bを生成する処理および出力結果データ240cを生成する処理を実行する処理部である。図3に示すように、この制御部250は、トライ木生成部250aおよび集計処理部250bを有する。
このうち、トライ木生成部250aは、入力キー管理テーブル240aに含まれる文字列と値とを利用して、トライ木データ240bを生成する処理部である。集計処理部250bは、トライ木データ240bに含まれる文字列を区切文字に基いて分類し、分類した文字列毎に値を集計することで、出力結果データ240cを生成する処理部である。トライ木生成部250aおよび集計処理部250bの具体的な処理の説明は後述する。
次に、図3の記憶部240に記憶された入力キー管理テーブル240a、トライ木データ240b、出力結果データ240cのデータ構造の一例について順に説明する。図4は、入力キー管理テーブルのデータ構造の一例を示す図である。図4に示すように、この入力キー管理テーブル240aは、入力キーと値とを対応付けて記憶する。例えば、入力キー管理テーブル240aの1段目では、入力キー「Mie/Tsu/1chome」と、値「20」とが対応付けられている。また、各入力キーに含まれる「/」は、区切文字である。例えば、入力キー「Mie/Tsu/1chome」は第一、二階層の区切文字が含まれている。このため、入力キー「Mie/Tsu/1chome」は区切文字により、「Mie」、「Mie/Tsu」、「Mie/Tsu/1chome」に区切られる。
ここで、文字列に含まれる区切文字の内、先頭側から順に数えてN番目の区切文字を、第N階層の区切文字と定義する。Nは自然数である。例えば、文字列「Mie/Tsu/1chome」において、文字列「Mie」と「Tsu」に挟まれる区切文字「/」は、先頭側から順に数えて1番目の区切文字となるため、かかる区切文字は、第一階層の区切文字となる。
図5は、トライ木データのデータ構造の一例を示す図である。図5に示すトライ木データ240bは、図4に示した入力キー管理テーブル240aに基づいて、トライ木生成部250aが生成するデータである。このトライ木データ240bは、ノード1〜9を有する。各ノードは、所定の文字に対応付けられると共に、一致数およびタグキー、値が登録されている。ここで、タグキーは、ノードに割当てられた文字列のうち、一部の文字列を示す。
一致数は、基準ノードに割り当てられた文字列の内、子ノードに割当てられた文字列と一致する文字数から、基準ノードの階層数を除いた数となる。ここで、基準ノードの階層数とは、ルートノードから基準ノードに至るまでのノードの数に対応する。
例えば、基準ノードをノード2とし、ノード2の一致数について説明する。ノード2に割当てられた文字列を「Mie/Inabe/4chome」とし、子ノードに対応するノード3に割当てられた文字列が「Mie/Tsu/1chome」とする。この場合、ノード2の文字列とノード3の文字列は先頭の「Mie/」が一致しているため、一致する文字数は「4」となる。そして、ノード2の階層数が1であるため、一致する文字数「4」から「1」を減算した値「3」がノード2の一致数となる。
トライ木データ240bに含まれるノード2〜9は、自身に対応付けられた文字と、自身に登録された一致数・タグキーとで、自身に割当てられた文字列を表現する。具体的に、ノードに割当てられた文字列は、自身に割り当てられた文字と、一致数により特定される文字列と、タグキーとを組合せた文字列となる。
ここで、一致数により特定される文字列とは、子ノードに割当てられた文字列のうち、先頭文字から基準ノードの階層の数分進めた文字から一致数分の文字までの間の文字列となる。例えば、基準ノード2の階層を「1」、一致数を「3」とし、子ノードに割当てられた文字列を「Mie/Tsu/1chome」となる場合の、一致数により特定される文字列を説明する。子ノードに割当てられた文字列のうち、先頭文字「M」から階層の数「1」分進めた文字は「i」となる。そして、かかる文字「i」を含む一致数分「3」の文字「/」までの文字列は「ie/」となる。このため、基準ノード2の一致数「3」により特定される文字列は「ie/」となる。
具体的に、ノード2に割当てられた文字列について説明する。ノード2に対応付けられた文字は「M」である。ノード2の一致数「3」により特定される文字列は「ie/」である。ノード2のタグキーは、「Inabe/4chome」である。このため、ノード2に割当てられた文字列は、「M」と、「ie/」と、「Inabe/4chome」とを組合せた文字列「Mie/Inabe/4chome」となる。
次に、トライ木データ240bに含まれるノード1〜9のより詳細なデータ構造の一例について説明する。図6は、トライ木データに含まれるノードのデータ構造の一例を示す図である。図6に示すノード構造体21〜29は、図5に示したノード1〜9に対応する。ノード構造体21〜29は、「ノード識別情報」、「キー、遷移先」、「一致数」、「タグキー」、「値」を有する。
このうち、「ノード識別情報」は、ノード構造体を一意に識別するデータである。ノード構造体21〜29のノード識別情報は、「node1〜node9」となる。「キー、遷移先」は、遷移先のノード構造体に対応付けられた文字と、遷移先のノード構造体のノード識別情報とを対応付けたデータである。例えば、ノード構造体21はノード1に対応し、ノード1は文字「M」が対応付けられたノード2に接続されている。そして、ノード2はノード識別情報「node2」のノード構造体22に対応する。このため、ノード構造体21の「キー、遷移先」は、「M、node2」となる。
「タグキー」、「一致数」、「値」は、上記のタグキー、一致数、値の説明と同様である。ただし、タグキーに対応する文字列は、ノードに割当てられた文字列の内、所定の文字を指すポインタを用いることで表現される。例えば、ノード構造体22に割当てられた文字列が「Mie/Inabe/4chome」であり、タグキーが「Inabe/4chome」の場合について説明する。この場合、ノード構造体22のタグキーには、テキストデータ「Mie/Inabe/4chome」に含まれる文字列のうち、「I」を指すポインタが格納され、ポインタに指された文字以降の文字列がタグキーに対応する文字列となる。
図7は、出力結果データのデータ構造の一例を示す図である。この出力結果データ240cは、区切文字により分類された所定の文字列と、この所定の文字列に対応する値の集計値とを対応付ける。
例えば、文字列「Mie」に対応する値の集計値は、文字列の先頭が「Mie/」となる全ての文字列に割当てられた値の集計値となる。すなわち、文字列「Mie」の集計値は、文字列「Mie/Inabe/4chome」、「Mie/inabe」、「Mie/Tsu/1chome]、「Mie/Tsu/2chome」、「Mie/Tsu/3chome」、「Mie/Tsu/4chome」、「Mie/Tsu」、「Mie/Yokkaichi/6chome」、「Mie/Yokkaichi」の各値を集計したものとなる。
次に、トライ木生成部250aがトライ木データ240bを生成する処理について具体的に説明する。なお、トライ木生成部250aがトライ木データ240bを生成する場合に、各文字列の優先度を判定し、優先度が小さい文字列ほどルートノードに近いノードに割当てる。
トライ木生成部250aは、優先度を判定する場合に、異なる文字が検出されるまで比較対象となる各文字列の文字を先頭から順に抽出する。そして、トライ木生成部250aは、抽出した文字において、アルファベット順で、aに近い文字ほど優先度が小さいと判定し、zに近い文字ほど優先度が大きいと判定する。すなわち、優先度は、「a<b<c<d<e<f<g<h<i<j<k<l<m<n<o<p<q<r<s<t<u<v<w<x<y<z」となる。なお、優先度が同じ文字列は、等しい文字列である。
例えば、文字列「black」と「blue」との優先度の大小関係について説明する。トライ木生成部250aが、「black」と「blue」とを比較すると、3文字目で異なる文字を抽出する。具体的には、トライ木生成部250aが「black」から「a」を抽出し、「blue」から「u」を抽出する。「a」は「u」よりも優先度が小さいので、トライ木生成部250aは、「black」を「blue」よりもルートノード側のノードに割当てる。
続いて、文字列「green」と「greenyellow」との優先度の大小関係について説明する。トライ木生成部250aが、「green」と「greenyellow」とを比較すると、6文字目で異なる文字が抽出する。具体的には、トライ木生成部250aが「green」から「空」を抽出し、「greenyellow」から「y」を抽出する。このような場合、トライ木生成部250aは、「空」が抽出されなかったキー「greenyellow」の方が「green」よりも優先度が大きいと判定する。したがって、トライ木生成部250aは、優先度の小さい「green」を「greenyellow」よりもルートノード側のノードに割り当てる。
トライ木生成部250aは、トライ木データ240bに含まれるノードを、入力キーの先頭からの文字に応じて順に辿り、優先度の低い文字列ほど、ルートノード側のノードに登録されるように、トライ木データ240bを生成する。以下において、トライ木生成部250aが、トライ木データ240bを生成する具体的な処理手順について説明する。
図8〜図14は、本実施例2にかかるトライ木データを生成する処理を説明するための図である。ここでは説明の便宜上、入力キー管理テーブル240aに、下記に示す入力キーと値とが組み合わされたデータが登録されているものとする。具体的に、入力キー「http://aaa.aaa/e/」、値「1」と、入力キー「http://aaa.aaa/e/c/」、値「2」と、入力キー「http://aaa.aaa/d/」、値「3」と、入力キー「http://aaa.aaa/e/」、値「4」とが登録されているものとする。トライ木生成部250aは、入力キー管理テーブル240aに登録された入力キーと値との組を順に取り出して、トライ木データ240bを生成する。
まず、トライ木生成部250aが、トライ木データ240bにノードが存在しない状態で、入力キー「http://aaa.aaa/e/」、値「1」をトライ木データ240bに追加する場合について説明する。なお、世代数の初期値を0とする。この世代数は、入力キーが何文字目までタグキーと同じであるかを示す数値である。
図8に示すように、トライ木生成部250aは、ルートノード1を生成し(ステップS10)、入力キー「http://aaa.aaa/e/」を用意する(ステップS11)。トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の先頭文字「h」をキーとする子ノードが存在しないので、ルートノード1のタグキーと入力キーの優先度とを比較する。ここで、トライ木生成部250aは、比較対象となるタグキーがルートノードに存在しないので、タグキーを「空」とし、入力キーの優先度とタグキーの優先度とを比較する。タグキーは「空」なので、トライ木生成部250aは、ルートノードのタグキーの優先度よりも、入力キー「http://aaa.aaa/e/」の優先度が大きいと判定する。
このため、トライ木生成部250aは、ルートノードの配下に「h」に対応するノード2を生成し、入力キー「http://aaa.aaa/e/」からトライ部分「h」を取り除いた残りの文字列をタグキーとして、ノード2に登録する。また、トライ木生成部250aは、ノード2の配下にノードが存在しないので一致数「0」をノード2に登録すると共に、入力キー「http://aaa.aaa/e/」に対応する値「1」をノード2に登録する(ステップS12)。ここで、トライ部分とは、ルートノードから該当ノードに至るまでに通過する各ノードに対応する文字を順に並べた文字列となる。例えば、ノード2のトライ部分は、「h」となる。
続いて、図9に移行し、トライ木生成部250aが、ステップS12で生成したトライ木データに、入力キー「http://aaa.aaa/e/c/」、値「2」を追加する場合について説明する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」の先頭文字「h」でルートノード1〜ノード2に遷移する。そして、トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」のポインタを1つ進め、2文字目の「t」に設定する(ステップS13)。
トライ木生成部250aは、ノード2において、ポインタの指す「t」に対応する子ノードが存在しないので、ノード2のタグキー「http://aaa.aaa/e/」の優先度と、トライ部分の「h」を取り除いた入力キー「ttp://aaa.aaa/e/c/」の優先度とを比較する。トライ木生成部250aは、ノード2の一致数が「0」であるため、入力キーの先頭から順に比較を行う。
すると、入力キーの17文字目が「c」であり、タグキーの17文字目が「空」であるため、トライ木生成部250aは、入力キーの優先度が、タグキーの優先度よりも大きいと判定する。また、トライ木生成部250aは、入力キーとタグキーとを比較し、16文字「ttp://aaa.aaa/e/」が一致していると判定する(ステップS14)。
続いて、図10の説明に移行する。トライ木生成部250aは、ノード2に一致数「16」を登録し、ノード2のタグキー「ttp://aaa.aaa/e/」のポインタを16文字進める。その結果、ノード2に接続されるタグキーは「空」となる。また、トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」の2文字目の「t」に対応するノード3を生成する(ステップS15)。
トライ木生成部250aは、入力キーのポインタを3文字目の「t」に進める。トライ木生成部250aは、現在のノードをノード3に遷移し、入力キー「http://aaa.aaa/e/c/」からトライ部分の「ht」を取り除いた残りの文字列「tp://aaa.aaa/e/c/」を、ノード3のタグキーとして登録する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」に対応する値「2」をノード3に登録する。また、トライ木生成部250aは、ノード3の配下にノードが存在しないので、ノード3に一致数「0」を登録する(ステップS16)。
続いて、図11に移行し、トライ木生成部250aが、ステップS16で生成したトライ木データに、入力キー「http://aaa.aaa/d/」、値「3」を追加する場合について説明する。トライ木生成部250aは、入力キー「http://aaa.aaa/d/」を先頭文字から1文字ずつ読み出して、入力キーの1,2文字目の「h」、「t」に対応するノード2,3の順に遷移する。そして、トライ木生成部250aは、遷移したノードの数に応じて、入力キー「http://aaa.aaa/d/」のポインタを2つ進め、3文字目の「t」にポインタを設定する。
トライ木生成部250aは、ノード3において、「t」に対応する子ノードが存在しないので、ノード3のタグキー「tp://aaa.aaa/e/c」の優先度と、トライ部分の「ht」を取り除いた入力キー「tp://aaa.aaa/d/」の優先度とを比較する。すると、タグキーの14文字目が「e」であり、入力キーの14文字目が「d」であるため、トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きいと判定する(ステップS17)。
トライ木生成部250aは、トライ部分「ht」を取り除いた入力キー「tp://aaa.aaa/d/」とタグキー「tp://aaa.aaa/e/c」とを比較して、一致する文字列の数を求めることで世代数を判定する。「ht」を取り除いた入力キー「tp://aaa.aaa/d/」と「tp://aaa.aaa/e/c」とを比較すると、先頭から13文字「tp://aaa.aaa/」が一致しているので、トライ木生成部250aは、世代数が「13」とする。
トライ木生成部250aは、入力キー「http://aaa.aaa/d/」のポインタを現在の3文字目の「t」から13文字進めて、「d」に設定する。そして、トライ木生成部250aは、ノード3の親ノードとなるノード2に遷移し、世代数に1を加算して、世代数を「14」とする(ステップS18)。ここで、世代数が14となる理由は、親ノードとなるノード2に遷移することで、比較対象となる入力キーの文字が1文字増えるが、かかる増加分の文字は、親ノードに割当てられた文字と一致しているためである。
続いて、図12の説明に移行する。トライ木生成部250aは、ノード2のタグキー「空」の優先度と、入力キー「http://aaa.aaa/d/」の優先度をとを比較する前に、ノード2に登録された一致数と、入力キーの世代数とを比較する。ノード2の一致数は「16」であり、入力キーの世代数は「14」であるため、一致数の方が世代数よりも大きい。
一致数が世代数よりも大きい場合には、トライ木生成部250aは、ノード2のタグキー「空」の優先度と、入力キー「http://aaa.aaa/d/」の優先度を直接比較しなくても、ノード2のタグキーの優先度が入力キーの優先度よりも大きいと判定できる。
例えば、世代数14の入力キーは、先頭文字から13文字目までは、ノード2の子ノードとなるノード3のタグキーと同じであることを示し、14文字目において、入力キーの優先度がノード3の優先度よりも小さい。そして、ノード2の一致数が入力キーの世代数より大きいということは、ノード3のタグキーの優先度が入力キーの優先度よりも大きいという決め手になった文字まで、ノード2のタグキーは少なくとも同じである。したがって、トライ木生成部250aは、ノード2のタグキーの優先度と、入力キー「http://aaa.aaa/d/」の優先度を直接比較しなくても、ノード2のタグキーの優先度の方が大きいと判定できる。
ノード2の親ノードがルートノード1であるため、トライ木生成部250aは、ノード2の「一致数、タグキー、タグキーに対応する値」と、「世代数、入力キー、入力キーに対応する値」とを交換する。具体的に、トライ木生成部250aは、入力キーの世代数「14」を一致数としてノード2に登録し、入力キーの値「3」をノード2に登録する。また、トライ木生成部250aは、入力キー「http://aaa.aaa/d/」のポインタ以降の文字列「d/」をノード2のタグキーに登録する。
そして、トライ木生成部250aは、ノード2に割当てられていた文字列「http://aaa.aaa/e/」、ノード2に登録されていた値「1」、一致数「16」をそれぞれ、現在の入力キー、値、世代数に設定する。また、トライ木生成部250aは、入力キーのポインタを先頭文字から世代数の数「16」分だけ移行した「/」に設定する。トライ木生成部250aは、ノード2の子ノードとなるノード3に移行し、入力キーのポインタを1文字移動した「空」に設定する(ステップS19)。
トライ木生成部250aは、ノード3に遷移した場合に、世代数「16」から1を減算することで、世代数を「15」に設定する。そして、トライ木生成部250aは、ノード3の「一致数、タグキー、タグキーに対応する値」と、「世代数、入力キー、入力キーに対応する値」を交換する。具体的に、トライ木生成部250aは、入力キーの世代数「15」を一致数としてノード3に登録し、入力キーの値「1」をノード3に登録する。また、トライ木生成部250aは、入力キー「http://aaa.aaa/e/」のポインタ移行の文字「空」をノード3のタグキーに登録する。
そして、トライ木生成部250aは、ノード3に割当てられていた文字列「http://aaa.aaa/e/c/」、ノードに登録されていた値「2」、一致数「0」をそれぞれ、現在の入力キー、値、世代数に設定する。また、トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」のポインタを、先頭から、ルートノード1〜ノード3までの移動数「2」分だけ進めることで、3文字目の「t」に設定する(ステップS20)。
続いて、図13の説明に移行する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」のポインタに指される3文字目の「t」に対応するノードが、ノード3の配下に存在しない。このため、トライ木生成部250aは、ノード3の配下に「t」に対応するノード4を生成する。そして、トライ木生成部250aは、ノード4に遷移し、入力キーのポインタを4文字目の「p」に設定する(ステップS21)。
トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」からトライ部分「htt」を取り除いた残りの文字列「p://aaa.aaa/e/c/」をタグキーとしてノード4に登録する。また、トライ木生成部250aは、入力キー「http://aaa.aaa/e/c/」の値「2」をノード4に登録する。なお、ノード4の配下にノードが存在しないので、トライ木生成部250aは、ノード4の一致数を「0」に設定する(ステップS22)。
続いて、図14の説明に移行し、トライ木生成部250aが、ステップS22で生成したトライ木データに、入力キー「http://aaa.aaa/e/」、値「4」を追加する場合について説明する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の先頭文字から文字「htt」を順次読み出し、各文字に対応するノード2,3,4の順に遷移する。そして、トライ木生成部250aは、入力キー「http://aaa.aaa/e/」のポインタを先頭文字から3文字移動させ、4文字目の「p」にポインタを設定する(ステップS23)。
トライ木生成部250aは、ノード4において、「p」に対応する子ノードが存在しないので、ノード4のタグキー「p://aaa.aaa/e/c/」の優先度と、トライ部分「htt」を取り除いた入力キー「p://aaa.aaa/e/」の優先度とを比較する。トライ木生成部250aは、ノード3の一致数が「0」であるため、入力キーの先頭文字およびタグキーの先頭文字から順に比較を行う。
すると、トライ木生成部250aは、入力キーのトライ部分「htt」を除いた15文字目が「空」であり、タグキーの15文字目が「c」であるため、入力キーの優先度がタグキーの優先度よりも小さいと判定する。また、トライ木生成部250aは、トライ部分「htt」を除いた入力キー「p://aaa.aaa/e/」とタグキー「p://aaa.aaa/e/c/」とを比較して先頭からの一致する文字数を判定する。文字列「p://aaa.aaa/e/」が一致しているので、トライ木生成部250aは、一致する文字数を「14」文字と判定する。このため、トライ木生成部250aは、世代数を14に設定する。
トライ木生成部250aは、入力キー「http://aaa.aaa/e/」のポインタを4文字目の「p」から14文字進め、ポインタを「空」に設定する。また、トライ木生成部250aは、ノード4の親ノードとなるノード3に移行し、世代数「14」に1を加算して世代数を「15」に設定する(ステップS24)。
トライ木生成部250aは、ノード3の一致数と、世代数とを比較すると双方とも「15」で一致し、入力キーの優先度と、タグキーの優先度が等しくなるため、ノード3に入力キーに対応する値「4」を登録する(ステップS25)。なお、ノード3には既に値「1」が登録されている。トライ木生成部250aは、値「1」と「4」とを別々にノード3に登録しても良いし、値「1」と「4」とを加算した値「5」をノード3に登録しても良い。
トライ木生成部250aは、上記ステップS10〜S25の処理を実行することで、入力キー管理テーブル240aに格納された入力キーと値との組から、トライ木データ240bを生成する。
次に、図3に示した集計処理部250bの処理を具体的に説明する。この集計処理部250bは、トライ木データ240bに登録された文字列を区切文字に基づいて、所定の文字列毎に分類する処理を実行し、分類した文字列毎に各ノードに登録された値の集計を行う。まず、集計処理部250bが、区切文字に基づいて、トライ木データ240bに登録された各文字列を所定の文字列に分類する処理の概要について説明する。
集計処理部250bは、ノードのタグキーに区切文字「/」が含まれている場合には、かかるノードに割当てられた文字列と、子ノードに割当てられた文字列とは異なる組に属する文字列であると判定する。これに対して、集計処理部250bは、ノードのタグキーに区切文字「/」が含まれていない場合には、かかるノードに割当てられた文字列と、子ノードに割当てられた文字列とが同一の組に属する文字列であると判定する。
図15は、集計処理部が区切文字に基づいて文字列を分類する処理の概要を説明するための図である。図15に示すように、このトライ木データは、ノード1〜ノード4を含む。図15では、トライ部分、一致数、タグキーを利用して、各ノードに割当てられる文字列を表現している。ここで、ノード2は、文字「福」に対応付けられ、一致数「0」、タグキー「岡県/飯塚市」を登録しているので、ノード2には、文字列「福岡県/飯塚市」が割当てられていることに等しい。ノード3は、文字「島」に対応付けられ、一致数「2」、タグキー「いわき市」を登録しているので、ノード3には、文字列「福島県/いわき市」が割当てられていることに等しい。ノード4は、文字「県」に対応付けられ、一致数「0」、タグキー「/福島市」を登録しているので、ノード4には、文字列「福島県/福島市」が割当てられていることに等しい。
図15において、ノード2のタグキー「岡県/飯塚市」には、区切文字が含まれている。このため、集計処理部250bは、ノード2に割当てられた文字列「福岡県/飯塚市」と、ノード3に割当てられた文字列「福島県/いわき市」とが異なる組の文字列であると判定する。これに対して、ノード3のタグキー「いわき市」には、区切文字が含まれていない。このため、集計処理部250bは、ノード3に割当てられた文字列「福島県/いわき市」と、ノード4に割当てられた文字列「福島県/福島市」とが同じ組の文字列であると判定する。
続いて、集計処理部250bが図5に示したトライ木データ240bから図7に示した出力結果データ240cを生成する処理を具体的に説明する。図16〜図21は、集計処理部の処理を具体的に説明するための図である。なお、集計処理部250bは、処理を実行する段階で、記憶部240の記憶領域に、ノード識別領域、タグキー領域、文字列領域、集計データ領域(a)、(b)、出力領域を設ける。
ここで、ノード識別領域は、トライ木データ240bの各ノードのうち現在のノードを識別する情報を格納する。タグキー領域は、現在のノードに登録されたタグキーの文字列を格納する。文字列領域は、現在のノードに割当てられた文字列を格納する。集計データ領域(a)、(b)は、値の集計値を格納する。出力領域は、文字列の組と文字列の組に対応する集計値とを格納する。
本実施例2では一例として、トライ木データ240bに登録された文字列は、最大区切文字を2つ含み、最大で3階層の文字列からなるものとする。そして、集計処理部250bは、第一階層までの文字列「○○○」に分類される文字列の値を集計するために集計データ領域(a)を利用する。「○」は区切文字以外の文字に対応する。
また、集計処理部250bは、第一階層から第二階層までの文字列「○○○/○○○」の値を集計するために集計データ領域(b)を利用する。なお、図16〜21の下段には、トライ木データ240bのデータ構造を示す。
まず、図16の説明を行う。集計処理部250bは、出力領域、ノード識別領域、タグキー領域、文字列領域、集計データ領域(a)、(b)を「空」に設定する。そして、集計処理250bは、ノード識別領域に、ルートノード1を識別する「node1」を格納する(ステップS30)。
集計処理部250bは、ルートノード1に子ノードとなるノード2が存在するので、ノード2に遷移する。ノード2には、タグキー「Inabe/4chome」、値「5」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「Inabe/4chome」、集計データ領域(a)、(b)に値「5」を格納する。また、ノード2のトライ部分の文字は「M」、一致数「3」に対応する文字列は「ie/」、タグキーの文字列は「Inabe/4chome」であるため、集計処理部250bは、ノード2に割当てられた文字列を「Mie/Inabe/4chome」と判定する。集計処理部250bは、文字列領域に文字列「Mie/Inabe/4chome」を格納する。そして、集計処理部250bは、文字列領域に格納された文字列「Mie/Inabe/4chome」とノード2の値「5」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Inabe/4chome」と値「5」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS31)。
集計処理部250bは、ノード2のタグキーに第二階層の区切文字が存在するので、ノード2に割当てられた文字列のうち、第二階層までの文字列「Mie/Inabe」と、同じ組に属する文字列が、ノード2の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Mie/Inabe」と集計データ領域(b)の値「5」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(b)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Mie/Inabe」と値「5」をそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS32)。なお、集計処理部250bは、タグキー領域の文字列と、文字列領域の文字列を比較することで、何階層の区切文字がタグキー領域に含まれているのかを判定する。タグキー「Inabe/4chome」と、文字列「Mie/Inabe/4chome」と比較すると、タグキーの区切文字は、文字列に含まれる区切文字の内、先頭側から2番目に現れる区切文字となる。このため、集計処理部250bは、ノード2のタグキーを第二階層の区切文字と判定する。
集計処理部250bは、ノード2に子ノードとなるノード3が存在するので、ノード3に遷移する。ノード3には、タグキー「1chome」、値「25」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「1chome」を格納し、集計データ領域(a)、(b)の値にそれぞれ25を加算する。このため、集計データ領域(a)は30を格納し、集計データ領域(b)は25を格納する。また、ノード3のトライ部分の文字は「Mi」、一致数「6」に対応する文字列は「e/Tsu/」、タグキーの文字列は「1chome」であるため、集計処理部250bは、ノード3に割当てられた文字列を「Mie/Tsu/1chome」と判定する。集計処理部250bは、文字列領域に文字列「Mie/Tsu/1chome」を格納する。そして、集計処理部250bは、文字列領域に格納された文字列「Mie/Tsu/1chome」とノード3の値「25」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Tsu/1chome」と値「25」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS33)。
続いて、図17の説明に移行する。集計処理部250bは、ノード3のタグキーに区切文字が存在しないので、ノード3の長男ノードとなるノード4に遷移する。ノード4には、タグキー「2chome」、値「15」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「2chome」を格納し、集計データ領域(a)、(b)の値にそれぞれ15を加算する。このため、集計データ領域(a)は45を格納し、集計データ領域(b)は40を格納する。また、ノード4のトライ部分の文字は「Mie」、一致数「5」に対応する文字列は「/Tsu/」、タグキーの文字列は「2chome」であるため、集計処理部250bは、ノード4に割当てられた文字列を「Mie/Tsu/2chome」と判定する。集計処理部250bは、文字列「Mie/Tsu/2chome」を文字列領域に格納する。そして、集計処理部250bは、文字列領域に格納された文字列「Mie/Tsu/2chome」とノード4の値「15」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Tsu/2chome」と値「15」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS34)。
集計処理部250bは、ノード4のタグキーに区切文字が存在しないので、ノード4の子ノードとなるノード5に遷移する。ノード5には、タグキー「3chome」、値「8」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「3chome」を格納し、集計データ領域(a)、(b)にそれぞれ8を加算する。このため、集計データ領域(a)は53を格納し、集計データ領域(b)は48を格納する。また、ノード5のトライ部分の文字は「Mie/」、一致数「4」に対応する文字列は「Tsu/」、タグキーの文字列は「3chome」であるため、集計処理部250bは、ノード5に割当てられた文字列を「Mie/Tsu/3chome」と判定する。集計処理部250bは、文字列「Mie/Tsu/3chome」を文字列領域に格納する。集計処理部250bは、文字列領域に格納された文字列「Mie/Tsu/3chome」とノード5の値「8」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Tsu/3chome」と値「8」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS35)。
集計処理部250bは、ノード5のタグキーに区切文字が存在しないので、ノード5の子ノードとなるノード6に遷移する。ノード6には、タグキー「su/4chome」、値「7」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「su/4chome」を格納し、集計データ領域(a)、(b)にそれぞれ7を加算する。このため、集計データ領域(a)は60を格納し、集計データ領域(b)は55を格納する。また、ノード6のトライ部分の文字は「Mie/T」、一致数「0」に対応する文字列は無し、タグキーの文字列は「su/4chome」であるため、集計処理部250bは、ノード6に割当てられた文字列を「Mie/Tsu/4chome」と判定する。集計処理部250bは、文字列「Mie/Tsu/4chome」を文字列領域に格納する。集計処理部250bは、文字列領域に格納された文字列「Mie/Tsu/4chome」とノード6の値「7」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Tsu/4chome」と値「7」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS36)。
続いて、図18の説明に移行する。集計処理部250bは、ノード6のタグキーに第二階層の区切文字が存在するので、ノード6に割当てられた文字列のうち、第二階層までの文字列「Mie/Tsu」と同じ組に属する文字列が、ノード6の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Mie/Tsu」と集計データ領域(b)の値「55」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(b)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Mie/Tsu」と値「55」をそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS37)。
集計処理部250bは、ノード6の弟ノードとなるノード7に遷移する。ノード7には、タグキー「okkaichi/6chome」、値「35」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「okkaichi/6chome」を格納し、集計データ領域(a)、(b)にそれぞれ35を加算する。このため、集計データ領域(a)は95を格納し、集計データ領域(b)は35を格納する。また、ノード7のトライ部分は「Mie/Y」、一致数「0」に対応する文字列は無し、タグキー「okkaichi/6chome」であるため、集計処理部250bは、ノード7に割当てられた文字列を「Mie/Yokkaichi/6chome」と判定する。集計処理部250bは、文字列「Mie/Yokkaichi/6chome」を文字列領域に格納する。集計処理部250bは、文字列領域に格納された文字列「Mie/Yokkaichi/6chome」とノード7の値「35」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Mie/Yokkaichi/6chome」と値「35」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS38)。
集計処理部250bは、ノード7のタグキーに第二階層の区切文字が存在するので、ノード7に割当てられた文字列のうち、第二階層までの文字列「Mie/Yokkaichi」と同じ組に属する文字列が、ノード7の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Mie/Yokkaichi」と集計データ領域(b)の値「35」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(b)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Mie/Yokkaichi」と値「35」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS39)。
続いて、図19の説明に移行する。集計処理部250bは、ノード7に子ノードが存在せず、かつ、弟ノードが存在しないので、親ノードとなるノード5に遷移する。集計処理部250bは、ノード5に割当てられたタグキーが「3chome」であるため、タグキー領域に文字列「3chome」を格納する。また、上記ステップS35と同様に、ノード5に割当てられた文字列は「Mie/Tsu/3chome」であるため、集計処理部250bは、文字列「Mie/Tsu/3chome」を文字列領域に格納する(ステップS40)。
集計処理部250bは、ノード5に対応する文字が区切文字であるか否かを判定する。ノード5に対応する文字は区切文字「/」であり、かかる区切文字は、第一階層の区切文字であるため、集計処理部250bは、ノード5に割当てられた文字列のうち、第一階層までの文字列「Mie」と集計データ領域(a)の値「95」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(a)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Mie」と値「95」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS41)。
ここで、集計処理部250bが、ノードに対応する区切文字が何階層の区切文字であるかを判定する処理の一例について説明する。集計処理部250bは、ルートノード1からノード5に至るまでの各ノード1〜5に対応する文字「M、i、e、/」を順に検出する。そして、集計処理部250bは、抽出した文字に含まれる区切文字のうち、ノード5に対応する区切文字は、先頭側から何番目の区切文字であるかを判定する。ノード5に対応する区切文字は、1つ目の区切文字である。このため、集計処理部250bは、ノード5に対応する区切文字を第一階層の区切文字であると判定する。
集計処理部250bは、ノード5に弟ノードが存在しないので、親ノードとなるノード4に遷移する。集計処理部250bは、ノード4に割当てられたタグキーが「2chome」であるため、タグキー領域に文字列「2chome」を格納する。また、上記ステップS34と同様に、ノード4に割当てられた文字列は「Mie/Tsu/2chome」であるため、集計処理部250bは、文字列「Mie/Tsu/2chome」を文字列領域に格納する(ステップS42)。
続いて、図20の説明に移行する。集計処理部250bは、ノード4に対応する文字が区切文字であるか否かを判定する。ノード4に対応する文字は区切文字ではなく、ノード4に弟ノードが存在するため、ノード8に遷移する。ノード8には、タグキー「endai/1chome」、値「5」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「endai/1chome」を格納し、集計データ領域(a)、(b)にそれぞれ40を加算する。このため、集計データ領域(a)は40を格納し、集計データ領域(b)は40を格納する。また、ノード8のトライ部分は「Miy」、一致数「5」に対応する文字列は「agi/S」、タグキーの文字列は「endai/1chome」であるため、集計処理部250bは、ノード8に割当てられた文字列を「Miyagi/Sendai/1chome」と判定する。集計処理部250bは、文字列「Miyagi/Sendai/1chome」を文字列領域に格納する。集計処理部250bは、文字列領域に格納された文字列「Miyagi/Sendai/1chome」とノード8の値「40」との組を、出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Miyagi/Sendai/1chome」と値「40」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS43)。
集計処理部250bは、ノード8のタグキーに第二階層の区切文字が存在するので、ノード8に割当てられた文字列のうち、第二階層までの文字列「Miyagi/Sendai」と同じ組に属する文字列が、ノード8の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Miyagi/Sendai」と集計データ領域(b)の値「35」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(b)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Miyagi/Sendai」と値「40」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS44)。
集計処理部250bは、ノード8の子ノードとなるノード9に遷移する。ノード9には、タグキー「gi/Shiroishi/3chome」、値「4」が登録されている。このため、集計処理部250bは、タグキー領域に文字列「gi/Shiroishi/3chome」を格納し、集計データ領域(a)、(b)にそれぞれ4を加算する。このため、集計データ領域(a)は44を格納し、集計データ領域(b)は4を格納する。また、ノード9のトライ部分は「Miya」、一致数「0」に対応する文字列は無し、タグキーの文字列は「gi/Shiroishi/3chome」であるため、集計処理部250bは、ノード9に割当てられた文字列を「Miyagi/Shiroishi/3chome」と判定する。集計処理部250bは、文字列「Miyagi/Shiroishi/3chome」を文字列領域に格納する。集計処理部250bは、文字列領域に格納された文字列「Miyagi/Shiroishi/3chome」とノード9の値「4」との組を出力領域に格納する。集計処理部250bは、出力領域に格納された文字列「Miyagi/Shiroishi/3chome」と値「4」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS45)。
続いて、図21の説明に移行する。ノード9のタグキーには、第一階層の区切文字と第二階層の区切文字が存在する。集計処理部250bは、まず、ノード9に割当てられた文字列のうち、第二階層までの文字列「Miyagi/Shiroishi」と同じ組に属する文字列が、ノード9の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Miyagi/Shiroishi」と集計データ領域(b)の値「4」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(b)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Miyagi/Shiroishi」と値「4」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS46)。
続いて、集計処理部250bは、ノード9に割当てられた文字列のうち、第一階層までの文字列「Miyagi」と同じ組に属する文字列が、ノード9の配下の文字列に存在しないと判定する。このため、集計処理部250bは、文字列「Miyagi」と集計データ領域(a)の値「44」との組を、出力領域に格納する。また、集計処理部250bは、集計データ領域(a)の値を0にリセットする。集計処理部250bは、出力領域に格納された文字列「Miyagi」と値「44」とをそれぞれ、出力結果データ240cの文字列と集計値に登録する(ステップS47)。
上記のように、集計処理部250bが、ステップS30〜S47の処理を実行することで、トライ木データ240bに含まれる文字列を分類し、分類した文字列毎の値を集計することで出力結果データ240cを生成する。
次に、図3に示したトライ木生成部250aの処理手順の一例について説明する。図22は、トライ木生成処理部の処理手順を示すフローチャートである。図22に示すように、トライ木生成部250aは、ルートノードを生成し(ステップS101)、次の入力キーが入力キー管理テーブル240aに存在するか否かを判定する(ステップS102)。
トライ木生成部250aは、次の入力キーが存在しない場合には(ステップS103,No)、処理を終了する。一方、トライ木生成部250aは、次の入力キーが存在する場合には(ステップS103,Yes)、入力キーと値とを読み出す(ステップS104)。そして、トライ木生成部250aは、データ追加処理を行い(ステップS105)、ステップS102に移行する。
続いて、図22のステップS105に示したデータ追加処理の具体的な処理手順について説明する。図23〜図24は、データ追加処理の処理手順を示すフローチャートである。図23に示すように、トライ木生成部250aは、現在のノードをルートノードに設定し(ステップS201)、入力キーのポインタを先頭のキーに設定する(ステップS202)。
トライ木生成部250aは、入力キーのポインタの指すキーが「空」の場合に(ステップS203,Yes)、世代数を0に設定する(ステップS204)。そして、トライ木生成部250aは、図24のステップS209に移行する。
一方、トライ木生成部250aは、入力キーのポインタの指すキーが「空」ではない場合に(ステップS203,No)、ポインタの指すキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS205)。
トライ木生成部250aは、子ノードが存在する場合に(ステップS206,Yes)、ポインタの指すキーで子ノードに遷移し、入力キーのポインタを1つ進める(ステップS207)。そして、トライ木生成部250aは、ステップS203に移行する。
一方、トライ木生成部250aは、子ノードが存在しない場合に(ステップS206,No)、現在のノードのタグキーの優先度が入力キーの優先度よりも小さいか否かを判定する(ステップS208)。トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも小さくない場合に(ステップS208,No)、ステップS204に移行する。一方、トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも小さい場合に(ステップS208,Yes)、図25のステップS221に移行する。
続いて、図24の説明に移行する。トライ木生成部250aは、ノードの情報を参照する(ステップS209)。ここで、ノードの情報は、ノードに設定された一致数、タグキーを含む。トライ木生成部250aは、一致数と世代数が等しいか否かを判定する(ステップS210)。トライ木生成部250aは、一致数と世代数が等しい場合に(ステップS210,Yes)、タグキーと入力キーの優先度が等しいか否かを判定する(ステップS211)。
トライ木生成部250aは、タグキーと入力キーの優先度が異なる場合に(ステップS211,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS212)。トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きい場合に(ステップS212,Yes)、前方一致した文字数を世代数に追加する(ステップS213)。ここで、前方一致した文字数とは、タグキーの文字列と入力キー文字列とを比較し、各文字列が先頭文字から何文字目まで一致しているかを示す数である。
トライ木生成部250aは、前方一致した文字数分だけ、入力キーのポインタを進め(ステップS214)、兄ノードが存在する、または、親ノードがルートノードであるか否かを判定する(ステップS215)。トライ木生成部250aは、兄ノードが存在する、または、親ノードがルートノードの場合には(ステップS215,Yes)、図25のステップS226に移行する。一方、トライ木生成部250aは、兄ノードが存在せず、かつ、親ノードがルートノードでない場合に(ステップS215,No)、世代数に1を加算し、親ノードへ遷移する(ステップS216)。そして、トライ木生成部250aは、ステップS209に移行する。
ステップS210において、トライ木生成部250aは、一致数と世代数とが異なる場合に(ステップS210,No)、一致数が世代数よりも大きいか否かを判定する(ステップS217)。トライ木生成部250aは、一致数が世代数よりも大きい場合に(ステップS217,Yes)、ステップS215に移行する。一方、トライ木生成部250aは、一致数が世代数よりも小さい場合に(ステップS217,No)、図25のステップS219に移行する。
ステップS211において、トライ木生成部250aは、タグキーと入力キーの優先度が等しい場合に(ステップS211,Yes)、現在のノードに入力キーの値を追加し(ステップS218)、処理を終了する。
ステップS212において、トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも小さい場合に(ステップS212,No)、図25のステップS225に移行する。
続いて、図25の説明に移行する。トライ木生成部250aは、現在のノードのノード情報において、一致数に前方一致した文字数を加えると共に、タグキーのポインタを前方一致した文字数分だけ進める(ステップS219)。
トライ木生成部250aは、世代数が0の場合には(ステップS220,Yes)、新しいノードを生成し、入力キーの先頭文字をキーとして現在のノードから新しいノードに接続する(ステップS221)。トライ木生成部250aは、入力キーのポインタを1文字進め(ステップS222)、入力キーをタグキーとして新しいノードに追加する(ステップS223)。そして、トライ木生成部250aは、現在のノードに入力キーの値を追加し(ステップS224)、処理を終了する。
ステップS220において、トライ木生成部250aは、世代数が0ではない場合に(ステップS220,No)、世代数から1を減算し、長男ノードに遷移する(ステップS225)。そして、トライ木生成部250aは、「現在のノードの一致数、タグキー、ノードの値」と、「世代数、入力キー、入力キーの値」とを交換する(ステップS226)。トライ木生成部250aは、世代数が0ではない場合に(ステップS227,No)、ステップS225に移行する。一方、トライ木生成部250aは、世代数が0の場合に(ステップS227,Yes)、入力キーの先頭文字で子ノードに遷移し(ステップS228)、ステップS221に移行する。
次に、図3の集計処理部250bの処理手順の一例について説明する。図26は、集計処理部の処理手順を示すフローチャートである。図26に示すように、集計処理部250bは、現在のノードをルートノードに設定し(ステップS301)、子ノードが存在する場合に(ステップS302,Yes)、長男ノードへ遷移する(ステップS303)。
集計処理部250bは、一致数と階層数を加算した値を算出し、算出した値だけタグキーのポインタを戻した位置を特定する(ステップS304)。集計処理部250bは、特定した位置からタグキーの最後の文字までの文字列を取得し(ステップS305)、文字列および値を出力する(ステップS306)。
集計処理部250bは、ノード値と集計データ領域(a)の値とを加算した値を集計データ領域(a)に格納し、ノードの値と集計データ領域(b)の値とを加算した値を集計データ(b)に格納する(ステップS307)。
集計処理部250bは、タグキーを読み出し(ステップS308)、区切文字が存在しない場合に(ステップS309,No)、ステップS302に移行する。一方、集計処理部250bは、区切文字が存在する場合に(ステップS309,Yes)、グループキーとグループキーに対応する集計データ領域の値を出力する(ステップS310)。そして、集計処理部250bは、グループキーに対応する集計データ領域の値をリセットし(ステップS311)、ステップS302に移行する。ここで、グループキーは、ノードに割当てられた文字列のうち、区切文字の階層に対応する文字列までの文字列に対応する。
ところで、集計処理部250bは、子ノードが存在しない場合に(ステップS302,No)、親ノードから現在のノードへのキーを読み出す(ステップS312)。集計処理部250bは、読み出したキーが区切文字ではない場合に(ステップS313,No)、ステップS316に移行する。一方、集計処理部250bは、読み出したキーが区切文字の場合に(ステップS313,Yes)、グループキーとグループキーに対応する集計データ領域の値を出力する(ステップS314)。
集計処理部250bは、グループキーに対応する集計データ領域の値をリセットし(ステップS315)、弟ノードが存在するか否かを判定する(ステップS316)。集計処理部250bは、弟ノードが存在する場合に(ステップS316,Yes)、次の弟ノードへ遷移し(ステップS317)、ステップS307に移行する。
一方、集計処理部250bは、弟ノードが存在しない場合に(ステップS316,No)、親ノードがルートノードであるか否かを判定する(ステップS318)。集計処理部250bは、親ノードがルートノードではない場合に(ステップS318,No)、親ノードへ遷移し(ステップS319)、ステップS312に移行する。一方、集計処理部250bは、親ノードがルートノードの場合に(ステップS318,Yes)、処理を終了する。
上述してきたように、本実施例2にかかるデータ処理装置200は、ノードに対応付けられたタグキーに区切文字が含まれるか否かを利用して、トライ木データ240bに登録された区切文字を含む文字列を分類する。このため、データ処理装置200には、従来技術のように、ノードのタグキーに含まれる各文字をトライ木に展開することがない。したがって、本実施例2にかかるデータ処理装置200は、メモリ使用量を削減しつつ、トライ木データ240bに登録された区切文字を含む文字列を効率的に分類することができる。
また、データ処理装置200は、タグキーに区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列と、該ノードの子ノードにより表現される文字列とを異なる組に分ける。このため、データ処理装置200は、トライ木データ240bの区切文字毎に、正確に文字列を分類することができる。
また、データ処理装置200は、タグキーに区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列のうち、各区切文字よりも前に存在する文字列をそれぞれ特定する。そして、データ処理装置200は、特定した各区切文字を異なる組に分けることで、トライ木データ240bに含まれる各文字列を分類する。このため、データ処理装置200は、トライ木データ240bに登録された文字列が複数の階層の区切文字を含む場合でも、区切文字毎に、正確に文字列を分類することができる。
また、データ処理装置200は、トライ木データ240bに登録された文字列を区切文字に基づいて分類し、分類した文字列毎の値を集計する。データ処理装置200は、ノードのタグキーに含まれる各文字をトライ木に展開することが無いので、辿るべきノードの数が少なくなり、その結果、各文字列に対応する集計値を効率よく算出することができる。
なお、上記の実施例では一例として、子ノードの文字列と一致する文字数を含むタグキーを親ノードに登録していた。しかし、本願発明は、これに限定されるものではない。例えば、親ノードの文字列と一致する文字数を含むタグキーを子ノードに登録しても、同様に処理することが可能である。
ところで、図2に示した入出力制御部230、制御部250は、例えば、ASIC(Application Specific Integrated Circuit)や、FPGA(Field Programmable Gate Array)などの集積装置に対応する。または、入出力制御部230、制御部250は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)等の電子回路に対応する。また、図2に示した記憶部240は、例えば、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ(Flash Memory)などの半導体メモリ素子、またはハードディスク、光ディスクなどの記憶装置に対応する。
ところで、図2に示したデータ処理装置200の各構成要素は、機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、データ処理装置200の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、トライ木生成部250aの機能を拡張カードなどの外部装置に搭載し、拡張カードを該当するサーバに接続してもよい。
なお、データ処理装置200は、既知のパーソナルコンピュータ、ワークステーション、携帯電話、PHS端末、移動体通信端末またはPDAなどの情報処理装置に、データ処理装置200の各機能を搭載することによって実現することもできる。
図27は、本実施例にかかるデータ処理装置を構成するコンピュータのハードウェア構成を示す図である。図27に示すように、このコンピュータ300は、各種演算処理を実行するCPU(Central Processing Unit)310と、ユーザからのデータの入力を受け付ける入力装置320と、モニタ330を有する。また、コンピュータ300は、記憶媒体からプログラム等を読取る媒体読み取り装置340と、ネットワークを介して他のコンピュータとの間でデータの授受を行うネットワークインターフェース装置350を有する。また、コンピュータ300は、各種情報を一時記憶するRAM(Random Access Memory)360と、ハードディスク装置370を有する。各装置310〜370は、バス380に接続される。
そして、ハードディスク装置370には、図2に示したトライ木生成部250aと同様の機能を有するトライ木生成プログラム370aを記憶する。また、ハードディスク装置370は、図2に示した集計処理部250bと同様の機能を有する集計処理プログラム370bを記憶する。
CPU310がトライ木生成プログラム370aをハードディスク装置370から読み出してRAM360に展開することで、トライ木生成プログラム370aは、トライ木生成プロセス360aとして機能する。また、CPU310が集計処理プログラム370bをハードディスク装置370から読み出してRAM360に展開することで、集計処理プログラム370bは、集計処理プロセス360bとして機能する。そして、トライ木生成プロセス360aは、トライ木データを生成する。集計処理プロセス360bは、トライ木データの文字列を区切文字に基づいて分類し、分類した文字列毎に集計値を算出する。
なお、上記トライ木生成プログラム370aおよび集計処理プログラム370bは、必ずしもハードディスク装置370に格納されている必要はない。例えば、CD−ROM等の記憶媒体に記憶されたプログラムを、コンピュータ300が読み出して実行するようにしてもよい。また、公衆回線、インターネット、LAN(Local Area Network)、WAN(Wide Area Network)等にこのプログラムを記憶させておき、コンピュータ300がこれらからプログラムを読み出して実行するようにしてもよい。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
区切文字または所定の文字に対応する複数のノードが木構造にて接続され、単一のノードに対して区切文字を含む単一の文字列または区切文字を含まない単一の文字列を含むタグキーと、所定のノードにより表現される文字列と該所定のノードの子ノード又は親ノードにより表現される文字列との間で一致する文字の数を示す一致数とが対応付けられ、根ノードから所定のノードに至るまでに辿るノードに対応する各文字と、前記所定のノードに登録されたタグキーの文字列と、前記一致数に対応する文字列とを組合せることで当該ノードの文字列を表現するトライ木データを記憶装置から取得するトライ木取得手順と、
前記トライ木データに含まれる各ノードのうち、タグキーに区切文字を含まないノードを検出し、検出したノードにより表現される文字列と該ノードの子ノード又は親ノードにより表現される文字列とを同一の組にまとめることで、前記トライ木データに含まれる各文字列を分類する分類手順と
を実行させることを特徴とするトライ木分類プログラム。
(付記2)前記分類手順は、前記タグキーに区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列と、前記ノードの子ノード又は親ノードにより表現される文字列とを異なる組に分けることで、前記トライ木データに含まれる各文字列を分類することを特徴とする付記1に記載のトライ木分類プログラム。
(付記3)前記分類手順は、前記タグキーに複数の区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列のうち、各区切文字よりも前に存在する文字列をそれぞれ特定し、特定した各文字列を異なる組に分けることで、前記トライ木データに含まれる各文字列を分類することを特徴とする付記2に記載のトライ木分類プログラム。
(付記4)前記トライ木データに含まれる複数のノードは所定の数値を保持し、前記分類手順によって分類された文字列の組毎にノードが保持する値を集計する集計手順を更にコンピュータに実行させることを特徴とする付記1、2または3に記載のトライ木分類プログラム。
(付記5)トライ木分類装置が、
区切文字または所定の文字に対応する複数のノードが木構造にて接続され、単一のノードに対して区切文字を含む単一の文字列または区切文字を含まない単一の文字列を含むタグキーと、所定のノードにより表現される文字列と該所定のノードの子ノード又は親ノードにより表現される文字列との間で一致する文字の数を示す一致数とが対応付けられ、根ノードから所定のノードに至るまでに辿るノードに対応する各文字と、前記所定のノードに登録されたタグキーの文字列と、前記一致数に対応する文字列とを組合せることで当該ノードの文字列を表現するトライ木データを記憶装置から取得するトライ木取得ステップと、
前記トライ木データに含まれる各ノードのうち、タグキーに区切文字を含まないノードを検出し、検出したノードにより表現される文字列と該ノードの子ノード又は親ノードにより表現される文字列とを同一の組にまとめることで、前記トライ木データに含まれる各文字列を分類する分類ステップと
を含んだことを特徴とするトライ木分類方法。
(付記6)前記分類ステップは、前記タグキーに区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列と、前記ノードの子ノード又は親ノードにより表現される文字列とを異なる組に分けることで、前記トライ木データに含まれる各文字列を分類することを特徴とする付記5に記載のトライ木分類方法。
(付記7)前記分類ステップは、前記タグキーに複数の区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列のうち、各区切文字よりも前に存在する文字列をそれぞれ特定し、特定した各文字列を異なる組に分けることで、前記トライ木データに含まれる各文字列を分類することを特徴とする付記6に記載のトライ木分類方法。
(付記8)前記トライ木データに含まれる複数のノードは所定の数値を保持し、前記分類ステップによって分類された文字列の組毎にノードが保持する値を集計する集計ステップを更に含むことを特徴とする付記5、6または7に記載のトライ木分類方法。
(付記9)区切文字または所定の文字に対応する複数のノードが木構造にて接続され、単一のノードに対して区切文字を含む単一の文字列または区切文字を含まない単一の文字列を含むタグキーと、所定のノードにより表現される文字列と該所定のノードの子ノード又は親ノードにより表現される文字列との間で一致する文字の数を示す一致数とが対応付けられ、根ノードから所定のノードに至るまでに辿るノードに対応する各文字と、前記所定のノードに登録されたタグキーの文字列と、前記一致数に対応する文字列とを組合せることで当該ノードの文字列を表現するトライ木データを記憶するトライ木記憶部と、
前記トライ木記憶部に記憶された前記トライ木データに含まれる各ノードのうち、タグキーに区切文字を含まないノードを検出し、検出したノードにより表現される文字列と該ノードの子ノード又は親ノードにより表現される文字列とを同一の組にまとめることで、前記トライ木データに含まれる各文字列を分類する分類部と
を有することを特徴とするトライ木分類装置。
(付記10)前記分類部は、前記タグキーに区切文字を含むノードを検出した場合に、検出したノードにより表現される文字列と、前記ノードの子ノード又は親ノードにより表現される文字列とを異なる組に分けることで、前記トライ木データに含まれる各文字列を分類することを特徴とする付記9に記載のトライ木分類装置。