以下に、本願の開示する記憶媒体、トライ木生成方法およびトライ木生成装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
まず、本実施例にかかる検索装置の説明を行う前に、木構造に含まれるノードの用語について説明する。図1は、木構造に含まれるノードの用語を説明するための図である。図1に示すように、トライ木を構成する各ノードのうち、最上層に位置するノードをルートノードと定義する。また、基準ノードのひとつ上の層に存在し、基準ノードに接続されたノードを、基準ノードに対する親ノード(以下、単に親ノード)と定義する。また、基準ノードのひとつ下の層に存在し、基準ノードに接続されたノードを基準ノードに対する子供ノード(以下、単に子供ノード)と定義する。
また、基準ノードと同じ層に存在し、基準ノードと同じ親ノードに接続され、基準ノードの上側に存在するノードを、基準ノードに対する兄ノード(以下、単に兄ノード)と定義する。また、基準ノードと同じ層に存在し、基準ノードと同じ親ノードに接続され、基準ノードの下側に存在するノードを、基準ノードに対する弟ノード(以下、単に弟ノード)と定義する。また、根ノードから親ノードに至る各ノードをまとめて先祖ノードと定義する。また、基準ノードの配下に接続された各ノードをまとめて子孫ノードと定義する。
次に、本実施例にかかる検索装置の概要について説明する。図2、図3は、本実施例にかかる検索装置の概要を説明するための図である。まず、図2に示すように、本実施例にかかる検索装置は、指定されたキーに基づいてトライ木を生成する場合に、1つのノードに1つのキーを割当てる。以下の説明において、ノードに割当てられたキーをタグキーと表記する。図1において、ノードb、l、g、r、eには、それぞれタグキー「black、blue、green、grey、greenyellow」が1つずつ割当てられている。また、ノードb、l、g、r、eには、値「1、3」、「4」、「3」、「5、2」、「1」がそれぞれ割当てられている。
図2に示したトライ木は、図90に示したトライ木あるいは図91に示したパトリシア木と同じように、タグキー「black、green、blue、grey、black、grey、greenyellow」にそれぞれ値「1、3、4、5、3、2、1」を割当てている。しかし、本実施例にかかるトライ木は、図90、Bに示したトライ木、パトリシア木と異なり、1ノードにタグキーを一つ対応付けているため、データを持っていないノードが存在せず、メモリ利用効率を高めることができる。また、本実施例にかかるトライ木は、ノードに含まれる文字数が多い場合であっても、トライ木のノード数を増加させる必要がないため、メモリ使用量を抑えることが出来る。
ただし、本実施例にかかるトライ木は、1つのノードに1つのタグキーを割当てた代償として、実際にノードに登録されたタグキーを参照しなければ、入力キーがタグキーにヒットしたか否かを判定できない。例えば、図2に示したトライ木では、入力キー「blue」の1文字目「b」により、ノードを遷移すると、まず、ルートノードからノードbに移行する。ノードbに移行した時点では、入力キーにヒットしたか否かを判定できない。実際に、ノードbのタグキー「black」と比較して初めて、ヒットしていないと判定できる。
そして、2文字目「l」によりノードlに遷移し、ノードlのタグキー「blue」と入力キー「blue」とを比較すると、入力キーとタグキーが一致したと判定できるので、ノードlに付加された値「4」が検出結果として検出される。したがって、ただ闇雲に、各ノードにタグキーを割当ててしまうと、各入力キーにより遷移する各ノードのタグキーと順次比較処理を行うこととなり、処理効率の向上が図れない。
かかる課題を解消するため、図3に示すように、本実施例にかかる検索装置は、深さ優先探索順でタグキーが並ぶようにトライ木を構築する。このように、深さ優先探索順でタグキーを並べると、データの検索時に入力キーと比較対象となるタグキーを有するノードを絞り込むことができ、処理の効率化を図ることができる。検索装置は、深さ優先探索順でキーが並ぶようにトライ木を構築する際に、各キーの優先度を判定し、優先度が小さいキーほどルートノードに近いノードに割当てる。
検索装置は、優先度を判定する場合に、異なる文字が検出されるまで各キーの文字を先頭から順に抽出する。そして、抽出した文字において、アルファベット順で、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」を比較すると、3文字目で異なる文字が抽出される。具体的には、「black」から「a」が抽出され、「blue」から「u」が抽出される。そして、「a」と「u」とを比較すると、「u」の方が「a」よりも優先度が大きくなる。したがって、優先度の小さい「black」を「blue」よりもルートノード側のノードに割り当てる。
また、「green」と「greenyellow」を比較すると、6文字目で異なる文字が抽出される。具体的には、「green」には6文字目が存在しないので「空」が抽出され、「greenyellow」から「y」が抽出される。このような場合には、検索装置は、空白が抽出されなかったキー「greenyellow」の方が「green」よりも優先度が大きいと判定する。したがって、優先度の小さい「green」を「greenyellow」よりもルートノード側のノードに割り当てる。
なお、本実施例では、同一の親ノードに直接接続された子ノードが複数存在する場合には、優先度の小さいキーを兄ノード側に配置し、優先度の大きいキーを弟ノード側に配置する。例えば、「black」と「green」とを比較すると、1文字目で異なる文字が抽出される。具体的には、「black」から「b」が抽出され、「green」から「g」が抽出される。そして、「b」と「g」を比較すると、「g」の方が「b」よりも優先度が大きくなる。したがって、優先度の小さい「black」を「green」よりも兄側のノードに配置する。なお、図2のように、各タグキーを割当てると、複数の子ノードを有する親ノードのタグキーと兄弟ノードのタグキーとの優先度の大小関係は、親ノードのキー<長男ノードのキー<次男ノードのキー<三男ノード<・・・となる。また、配下に接続されるノードほど優先度が大きくなる。例えば、図3において、ノードeのキーの優先度は、ノードr、gの優先度よりも大きい。
図3に示すように、各ノードにタグキーが配置されると、入力キーの優先度と、タグキーの優先度の関係から、検索対象となる入力キーの位置を絞り込むことが出来る。これは、入力キーと優先度が等しいタグキーを捜せばよいので、入力キーの文字により遷移する各ノードの内、入力キーよりも優先度が大きいノード以降のノード(子孫ノード)のタグキーと比較する必要は無く、入力キーよりも優先度が小さいノード以前のノード(先祖ノード)のタグキーと比較する必要が無くなるためである。
ここで、入力キーの文字を先頭から1文字ずつ読み出して、トライ木の各ノードを遷移し、最後に到達するノードを到達ノードと定義する。また、ルートノードから到達ノードに至る各ノードに含まれ、かつ、兄ノードを有するノードの内、優先度が最も大きいキーを有するノードを特定ノードと定義する。なお、兄ノードを有するノードが存在しない場合には、ルートノードの子ノードを特定ノードと定義する。
本実施例にかかる検索装置は、入力キーに一致するタグキーを検索する場合に、到達ノードから特定ノードに至る各ノードの内、いずれかを検索対象とすればよい。検索対象となるノードの中に、入力キーと一致するタグキーが存在しない場合には、その他のタグキーを参照しなくても、入力キーと一致するタグキーは存在しないと判定可能である。
なぜなら、特定ノードの親ノードのキーの優先度は、兄ノードのキーの優先度よりも小さく、兄ノードのキーの優先度は、弟ノード(特定ノード)のキー文字列に属する登録対象の入力キーの優先度よりも小さいからであり、入力キーが弟ノードを辿っている時点で、兄ノード側のタグキーの優先度よりも、入力キーの優先度の方が大きいことが確定するからである。
以下の説明において、到達ノードから特定ノードに至る各ノードを、比較対象ノードと表記する。検索装置は、入力キーと一致するキーを検索する場合には、かかる比較対象ノードのタグキーを対象として比較処理を実行すればよい。
図4は、比較対象ノードを説明するための図である。入力キーを先頭から1文字ずつ読みだし、最後にノード6に到達した場合には、比較対象ノードAに含まれるノード5,6のタグキーと入力キーとを比較すればよい。
続いて、本実施例にかかる検索装置が、新規のキーをトライ木に登録する場合について説明する。図5は、新規のキーをトライ木に登録する処理を説明するための図である。新規のキーをトライ木に構築する場合にも、比較対象ノードのタグキーと比較処理を行い、優先度に応じて、新規のキーをトライ木に登録すればよい。
図5を用いて具体的に説明する。図5の左側に示すトライ木は、ノードb、i、l、uに、それぞれキー「beige、bisque、black、blueviolet」が1つずつ割当てられている。また、ノードb、i、l、uには、値「2」、「4」、「1、3」、「3」がそれぞれ割当てられている。
検索装置は、図5の左側に示すトライ木に、キー「blue」、値「4」を追加する場合、到達ノードは「ノードu」、特定ノードは「ノードl」となる。したがって、比較対象ノードは、ノードl、ノードu、(ノードuの配下に接続されるノード)となる。
登録対象ノードに接続されたキー「blueviolet」、「black」をそれぞれ「blue」と比較すると、キー「blue」の優先度は、「blueviolet」よりも小さく、「black」よりも大きいので、「blueviolet」を有するノードと、「black」を有するノードの間に「blue」を登録すればよい。この場合には、図4の右側に示すように、ノードuにキー「blue」、値「4」を割り当て、ノードuの配下にノードeを作成して、かかるノードuに「blueviolet」、値「3」を割当てる。
ところで、本実施例にかかる検索装置は、トライ木のメモリ使用量を更に削減するべく、ノードにタグとして付加するタグキーを、トライ部分のキーを削除した形で保持するものとする。図6は、トライ部分のキーを削除した形でタグキーを保持するトライ木の一例を示す図である。
例えば、ノードlにタグキー「ack」が登録されているが、これは、ノードlにタグキー「black」を登録していることと同じ意味である。ルートノードからノードlに至るトライ部分のキーが「b、l」であるため、トライ部とタグキーとをあわせると「black」となる。
図6のようなデータ構造を取ることで、タグキーの文字列が減るので、入力キーと比較するタグキーの数を減らすことが出来る。また、図6のように、トライ木上にはタグキーのデータを持たずに、各ノードはタグキーへのポインタのみを保持しても良い。また、タグキーのデータを全て保持しておき、比較を開始する文字位置を変えても良い。
図7は、従来のパトリシア木のデータ構造による使用メモリ量と、本願発明にかかるトライ木の使用メモリ量とを示す図である。パトリシア木およびトライ木は、共に、キー「aaaaa、aacab、ababc、abacb、abcab」にそれぞれ「1、2、3、4、5」が割当てられている。
ここで、ノードメモリを1KB、タグキーメモリを1Byte、値メモリを4Byteとすると、パトリシア木は、ノードを10個、タグキーを17個、値を5個有しているので、合計で約10KBとなる。一方、本発明にかかるトライ木は、ノードを6ノード、タグキーを16個、値を4個有しているので、合計で約6KBとなる。したがって、本発明にかかるトライ木は、従来のパトリシア木と比較して、使用メモリ量を削減できる。
また、本実施例にかかる検索装置は、トライ木の末端ノードに対応するリーフノードからポインタ配列を削除しても構わない。ここで、ポインタ配列は、接続先のノードを示すポインタの配列である。図8は、リーフノードからポインタ配列を削除した場合のトライ木を示す図である。このように、リーフノードからポインタ配列を削除することにより、リーフノードの使用メモリ量を削減することができる。
図9は、図8および図6に示した手法を用いてメモリ量を削減した場合の、従来のパトリシア木のデータ構造による使用メモリ量と、本実施例にかかるトライ木の使用メモリ量とを示す図である。
ここで、内部ノードメモリを1KB、リーフノードメモリを12Byte、キー1文字当たりのメモリを1Byte、値メモリを4Byteとすると、パトリシア木は、内部ノードを5個、リーフノードを5個、キーを17文字、値を5個有しているので、合計で約5KBとなる。一方、本実施例のトライ木は、内部メモリを3個、リーフノードを3個、キーを19文字、値を5個有しているので、合計で約3KBとなる。このように、図8および図9の手法を用いて使用メモリ使用量を削減した場合であっても、本実施例にかかるトライ木の方がパトリシア木と比較して、メモリ使用量をより多く削減することが出来る。
次に、本実施例にかかる検索装置の構成について説明する。図10は、本実施例1にかかる検索装置の構成を示す図である。図10に示すように、この検索装置100は、入力部110と、出力部120と、入出力制御部130と、記憶部140と、制御部150を有する。
このうち、入力部110は、入力キー等の情報を入力する入力部であり、キーボードやマウス等に該当する。出力部120は、トライ木を用いた検索結果などの情報を出力する出力部であり、モニタ、若しくはディスプレイ、タッチパネル等に該当する。入出力制御部130は、入力部110、出力部120、記憶部140、制御部150によるデータの入出力を制御する処理部である。
記憶部140は、制御部150による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部140は、登録データ管理テーブル140aとトライ木140bを有する。
ここで、登録データ管理テーブル140aは、トライ木に登録するキーと値とを対応付けて記憶するテーブルである。図11は、本実施例1にかかる登録データ管理テーブル140aのデータ構造の一例を示す図である。図11に示すように、この登録データ管理テーブル140aは、キーと値を対応付けて記憶している。
トライ木140bは、登録データ管理テーブル140aを基にして生成されるトライ木である。図12は、本実施例1にかかるトライ木のデータ構造の一例を示す図である。図12では一例として、図11に示した登録データ管理テーブル140aに対応したトライ木を示す。図12に示すように、ルートノードにノードb、ノードgが接続されており、ノードbにノードlが接続されている。
また、ノードbは、タグキー「eige」と値「2」が接続されている。ノードlは、タグキー「ack」と値「1、3」が接続されている。ノードgは、タグキー「reen」と値「4」が接続されている。
図12に示したトライ木を実データで表すと図13−1に示すデータ構造となる。図13−1は、図12に示したトライ木を実データで表した場合のデータ構造の一例を示す図である。図13−1に示すように、このトライ木140bは、ポインタ配列10〜13、テキスト表14を有している。
ここで、ルートノードポインタに接続されたポインタ配列10は、図12のルートノードに対応し、ポインタ配列11は、図12のノードbに対応し、ポインタ12は、図12のノードlに対応する。また、ポインタ配列13は、図12のノードgに対応する。
ポインタ配列10〜13は、「TAG」領域と「Data」領域を有しており、「TAG」は、テキスト表14の文字と対応付けることで、ノードに接続されたタグキーを表現する。例えば、ポインタ配列11は、テキスト表14の「e」に接続されているので、「e」から次の空白前までの文字列「eige」をタグキーとして指定している。また、「Data」は、値と対応付けることで、ノードに接続された値を表現する。例えば、ポインタ配列11は、値「2」に接続されている。
また、各ポインタ配列10〜13は、配下に接続されたポインタ配列を判定するためのキー番号(ポインタ)「0×00〜0×FF」を有している。例えば、ポインタ配列10のキー番号「0×62」が、ポインタ配列11に接続され、ポインタ配列10のキー番号「0×67」が、ポインタ配列13に接続されている。
なお、図13−1等に示したトライ木140bの実データのデータ構造は、1ノードあたりASCIIコードの1文字にあたる8ビットの場合を示しているが、これに限定されるものではない。例えば、ASCIIコード1文字を4ビット単位の2つに分割して、1ノードあたり4ビットとしてもよい。その場合、ポインタ配列のもつキー番号は8ビットの場合に「0x00〜0xFF」の256個であったのに対し、4ビットの場合には「0x0〜0xF」の16個に減らすことができ、メモリ使用量を削減することが可能である。図13−2は、トライ木140bのその他のデータ構造の一例を示す図である。
例えば、「beige」の場合、1ノードあたり8ビットの場合には先頭キー番号「0x62」で、ポインタ配列11に接続されているが、1ノードあたり4ビットの場合には先頭キー番号として「0x62」の前半部分の「0x6」で、図13−2のポインタ配列XXに接続される。また、「beige」に加え「black」を続けて追加する場合、1ノードあたり8ビットの場合には2番目のキー番号「0x6c」でポインタ配列12に接続されているが、1ノードあたり4ビットの場合には2番目のキー番号として「0x62」の後半部分の「0x2」で、図13−2のポインタ配列YYに接続される。なお、ポインタ配列YYはポインタ配列XXへの接続のキー番号「0x6」とポインタ配列YYへの接続のキー番号「0x2」とをあわせた「0x62」、すなわち「b」を表すノードである。またさらに「blue」を続けて追加する場合、1ノードあたり8ビットの場合には3番目の文字「u]のキー番号「0x75」で次のポインタ配列に接続するが、1ノードあたり4ビットの場合には3番目のキー番号として2文字目「l」のキー番号「0x6c」の前半部分の「0x6」で次のポインタ配列に接続する。
また、日本語コードのようにマルチバイト文字に関しても、複数バイトを1文字として扱い、1ノードあたり16ビットとするのではなく、1文字を複数に分割して、1ノードあたり8ビットとしたり、4ビットとしてもよい。
なお、現在のコンピュータにおいては直接ビット位置を指定してビット列を取り出すことはできないが、ビット位置から所望のビット列を含むバイト位置を特定し、1バイトを取り出した後、ビット処理演算を用いて所望のビット列を取り出すことで処理できる。タグキーを表す文字列を取り出すときも同様に行うことができる。
また別に、リーフノードに該当するポインタ配列はすべてのキー番号領域がNULLであるので、ポインタ配列の一部(キー番号領域)を省くなどして簡略化しても良い。なお、この場合には、各ポインタ配列に、自身のポインタ配列がリーフノードであるか否かを示すフラグを設定する。
図10の説明に戻ると、制御部150は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図10に示すように、この制御部150は、トライ木生成部150aと、トライ木探索部150bを有する。
トライ木生成部150aは、登録データ管理テーブル140aに登録されたキーに基づいて、トライ木140bを生成する処理である。なお、トライ木生成部150aは、図2、図3等で説明したように、1つのノードに1つのキーを割当てることでトライ木140を構築する。また、トライ木生成部150aは、ノードにタグキーを登録する場合に、深さ優先探索順でタグキーが並ぶようにトライ木を生成する。
図14は、トライ木生成部150aが、トライ木140bを生成する処理の概要を説明するための図である。なお、ここでは説明の便宜上、図14の左側に示すトライ木に入力キー「blue」、値「4」を登録する場合について説明する。また、図14の左側に示すトライ木は、図6において説明したトライ木と同様にして、トライ部分のキーを削除した状態で、各ノードにタグキーを割当てている。
まず、トライ木生成部150aは、入力キーから文字を1文字ずつ取り出し、トライ木上のノードを辿る。辿る途中において、トライ木生成部150aは、入力キーとタグキーとの比較を実行しない。入力キーが「blue」の場合には、「blue」の先頭から1文字ずつ文字を取り出し、トライ木上のノードを辿ると、ルートノード、ノードb、l、uの順に遷移する。
次に、トライ木生成部150aは、辿る先にノードが存在しない場合や、入力キーを全て辿った後に、兄ノードを持つノード、あるいは、ルートノードの子ノードまでノードを戻りながら、入力キーよりも小さいキーを検索する。つまり、比較対象ノード内で、入力キーよりも優先度の小さいタグキーを検索する。なお、入力キーとタグキーの優先度を比較する場合には、入力キーからトライ部のキーを除いた残りのキーとタグキーとを比較する。
入力キーが「blue」の場合には、比較対象ノードがノードu、ノードlとなるので、ノードu、ノードlの順に比較を行う。入力キー「blue」は、ノードlのタグキー「violet」よりも優先度が小さく、「ack」よりも優先度が大きい。なお、入力キー「blue」とタグキー「violet」との優先度を比較する場合には、ルートノードからノードuに至るトライ部のキー「blue」を入力キー「blue」から取り除いた後に比較する。また、入力キー「blue」とタグキー「ack」との優先度を比較する場合には、ルートノードからノードlに至るトライ部のキー「bl」を入力キー「blue」から取り除いた後に比較する。
トライ木生成部150aは、入力キーよりも優先度の大きいタグキーの中で、優先度が最小となるタグキーを有するノードに、入力キーおよび入力キーに対応する値を登録し、既に登録されてあったタグキーをシフトさせる。
入力キーが「blue」の場合には、トライ木生成部150aは、ノードuに入力キー「blue」、値「4」を登録する。ルートノードからノードuに至るトライ部分のキーが「blu」であるため、実際には、タグキー「e」をノードuに登録する。また、トライ木生成部150aは、ノードuに登録してあったタグキー「blueviolet」をシフトさせるべく、新規のノードeをノードuの配下に作成し、タグキー「blueviolet」を登録する。ノードeに至るトライ部分のキーが「blue」であるため、実際には、タグキー「violet」をノードeに登録する。上記のような登録処理を実行することで、図14の右側に示すトライ木が生成される。なお、トライ木生成部150aは、兄ノードを有するノードを識別するために、識別情報を登録しておいても良い。例えば、図14の右側では、ノードlが兄ノードiを有しているので、ノードlに識別情報を登録する。
以下において、トライ木生成部150aがトライ木を生成する処理について具体的に説明する。図15〜図24は、トライ木を生成する処理を説明するための図である。ここでは説明の便宜上、キー「http://aaa.aaa/e/」、値「1」と、キー「http://aaa.aaa/e/c/」、値「2」と、キー「http://aaa.aaa/e/c/」、値「3」と、キー「http://aaa.aaa/e/」、値「4」の順で、トライ木を生成する場合について説明する。
図15に示すように、まず、ノードが存在しない状態で、キー「http://aaa.aaa/e/」、値「1」を追加する場合について説明する。トライ木生成部150aは、ルートノードを生成する(ステップS10a)。実データ上において、トライ木生成部150aは、ルートノードに対応するポインタ配列20を生成し、ルートノードポインタとポインタ配列20を接続する。また、ポインタ配列20はルートノードに対応するので、「TAG」を空に接続する(ステップS10b)。
トライ木生成部150aは、入力キー「http://aaa.aaa/e/」を用意する(ステップS11a)。実データ上において、トライ木生成部150aは、テキスト表14に入力キー「http://aaa.aaa/e/」を格納し、入力キーのポインタを、テキスト表14の1列目の「h」に接続する(ステップS11b)。
トライ木生成部150aは、入力キー「http://aaa.aaa/e/」の先頭文字「h」をキーとする子ノードが存在しないので、ルートノードを参照する。ここで、ルートノードにタグキーは存在しないので、ルートノードのタグキーの優先度よりも、入力キー「http://aaa.aaa/e/」の優先度が大きくなる。
トライ木生成部150aは、ルートノードの配下に「h」をキーとするノードを作成し、入力キー「http://aaa.aaa/e/」から文字「h」を除いた残りのキーをタグキーとして、ノードhに接続する。また、入力キー「http://aaa.aaa/e/」の値「1」もノードhに接続する(ステップS12a)。
実データ上において、トライ木生成部150aは、ノードhに対応するポインタ配列21を生成し、ポインタ配列20のキー番号「0×68」で、ポインタ配列20とポインタ配列21を接続する。また、トライ木生成部150aは、ポインタ配列21の「TAG」をテキスト表14の2列目の「t」に接続し、ポインタ配列21の「Data」と値「1」を接続する(ステップS12b)。
続いて、図16に移行し、ステップS12a、12bにおいて作成したトライ木に、キー「http://aaa.aaa/e/c/」、値「2」を追加する場合について説明する。トライ木生成部150aは、入力キー「http://aaa.aaa/e/c/」の先頭文字hでルートノードからノードhに遷移する。そして、トライ木生成部150aは、入力キー「http://aaa.aaa/e/c/」のポインタを1つ進め、2文字目の「t」に設定する(ステップS13a)。
実データ上において、トライ木生成部150aは、テキスト表14に最後に登録されたキー「http://aaa.aaa/e/」との間を1つ空けて、キー「http://aaa.aaa/e/c」を登録する。そして、トライ木生成部150aは、テキスト表14の2行目2列目の文字「t」に入力キーのポインタを接続する(ステップS13b)。
トライ木生成部150aは、ノードhにおいて、「t」をキーとする子ノードが存在しないので、ノードhのタグキー「ttp://aaa.aaa/e/」の優先度と、トライ部分の「h」を取り除いた入力キー「ttp://aaa.aaa/e/c/」の優先度を比較する。すると、入力キーの17文字目がcであり、タグキーの17文字目が空であるため、入力キーの優先度が、タグキーの優先度よりも大きい(ステップS14)。したがって、入力キー「ttp://aaa.aaa/e/c/」は、ノードh以降のノードに登録する。
続いて、図17に移行し、トライ木生成部150aは、入力キー「http://aaa.aaa/e/c」の2文字目の「t」をキーとして新しいノードtを生成し、入力キーのポインタを3文字目の「t」に進める(ステップS15a)。
実データ上において、トライ木生成部150aは、ノードtに対応するポインタ配列22を生成し、ポインタ配列21のキー番号「0×74」で、ポインタ配列21とポインタ配列22を接続する。また、入力キーのポインタを1つ進め、テキスト表14の2行目3列目の「t」に入力キーのポインタを接続する(ステップS15b)。
トライ木生成部150aは、ステップS15aで作成したノードtに入力キー「http://aaa.aaa/e/c」からトライ部分の「ht」を除いた残りのキー「tp://aaa.aaa/e/c」をタグキーとして登録する(ステップS16a)。
実データ上において、トライ木生成部150aは、ポインタ配列22の「TAG」をテキスト表14の2行目3列目の「t」に接続し、ポインタ配列22の「Data」と値「2」を接続する(ステップS16b)。
続いて、図18に移行し、ステップS16a、16bにおいて作成したトライ木に、入力キー「http://aaa.aaa/d/」、値「3」を追加する場合について説明する。トライ木生成部150aは、入力キー「http://aaa.aaa/d/」の先頭文字から1文字ずつ取り出して、トライ木上をノードh、tの順に遷移する。そして、トライ木生成部150aは、遷移したノードの数に応じて、入力キー「http://aaa.aaa/d/」のポインタを2つ進め、3文字目の「t」に設定する。
そして、トライ木生成部150aは、ノードtにおいて、「t」をキーとする子ノードが存在しないので、ノードtのタグキー「tp://aaa.aaa/e/c」の優先度と、トライ部分の「ht」を取り除いた入力キー「tp://aaa.aaa/d/」の優先度を比較する。すると、タグキーの14文字目が「e」であり、入力キーの14文字目が「d」であるため、タグキーの優先度の方が、入力キーの優先度よりも大きくなる(ステップS17a)。
実データ上において、トライ木生成部150aは、テキスト表14に最後に登録されたキー「http://aaa.aaa/e/c」との間を1つ空けて、キー「http://aaa.aaa/d/」を登録する。そして、トライ木生成部150aは、テキスト表14の3行目5文字目の文字「t」に入力キーのポインタを接続する。また、ポインタ配列22の「TAG」に接続された文字を先頭とする文字列と、入力キーのポインタに接続された文字を先頭とする文字列とを順次比較すると、タグキーの14文字目が「e」であり、入力キーの14文字目が「d」であるため、タグキーの優先度の方が、入力キーの優先度よりも大きくなる(ステップS17b)。
トライ木生成部150aは、入力キー「http://aaa.aaa/d/」のポインタを一つ戻して、2文字目の「t」に設定し、ノードtの親ノードとなるノードhに遷移する。そして、トライ木生成部150aは、ノードhのタグキー「ttp://aaa.aaa/e/c」の優先度と、トライ部分の「h」を取り除いた入力キー「ttp://aaa.aaa/d/」の優先度を比較する。すると、タグキーの15文字目が「e」であり、入力キーの14文字目が「d」であるため、タグキーの優先度の方が、入力キーの優先度よりも大きくなる(ステップS18a)。
実データ上において、トライ木生成部150aは、現在のノードのポインタをポインタ配列31に接続し、テキスト表14の3行目4文字目の文字「t」に入力キーのポインタを接続する。また、ポインタ配列22の「TAG」に接続された文字を先頭とする文字列と、入力キーのポインタに接続された文字を先頭とする文字列とを順次比較すると、タグキーの15文字目が「e」であり、入力キーの15文字目が「d」であるため、タグキーの優先度の方が、入力キーの優先度よりも大きくなる(ステップS18b)。
続いて、図19に移行する。トライ木生成部150aは、ノードhの親ノードがルートノードであるため、ノードhのデータ(タグキー、値)と、入力データ(入力キー、値)を交換する。すなわち、トライ木生成部150aは、入力キー「http://aaa.aaa/d/」からトライ部分「h」を取り除いた残りのキー「ttp://aaa.aaa/d/」をノードhのタグキーに登録する。また、入力キー「http://aaa.aaa/d/」に対応する値「3」もノードhに登録する。また、トライ木生成部150aは、ノードhに登録されていたタグキー「ttp://aaa.aaa/e/」の先頭にトライ部分「h」を追加して、入力キーとして取り出す。また、タグキー「ttp://aaa.aaa/e/」に対応付けられていた値「1」も取り出す(ステップS19a)。
実データ上において、トライ木生成部150aは、ノードhのデータ(タグキー、値)と、入力データ(入力キー、値)を交換する。すなわち、トライ木生成部150aは、ノードhに対応するポインタ配列21の「TAG」をテキスト表14の3列目4列目の文字「t」に接続する。また、ポインタ配列21の「Data」と値「3」を接続する。そして、トライ木生成部150aは、入力キーのポインタを、テキスト表14の1行目2列目の「t」に接続する。また、ポインタ配列21の「Data」に接続されていた値「1」を入力値に保持する(ステップS19b)。
トライ木生成部150aは、ノードhから、入力キー「http://aaa.aaa/e/」の2文字目のtでノードtに遷移し、ノードtのデータ(タグキー、値)と入力データ(入力キー、値)を交換する。すなわち、トライ木生成部150aは、入力キー「http://aaa.aaa/e/」からトライ部分「ht」を取り除いた残りのキー「ttp://aaa.aaa/e/」をノードtのタグキーに登録する。また、入力キー「http://aaa.aaa/e/」に対応する値「1」もノードtに登録する。また、トライ木生成部150aは、ノードtに登録されていたタグキー「tp://aaa.aaa/e/c/」の先頭にトライ部分「h」を追加して、入力キーとして取り出す。また、タグキー「ttp://aaa.aaa/e/c/」に対応付けられていた値「2」も取り出す(ステップS20a)。
実データ上において、トライ木生成部150aは、ノードtのデータ(タグキー、値)と、入力データ(入力キー、値)を交換する。すなわち、トライ木生成部150aは、ノードtに対応するポインタ配列22の「TAG」をテキスト表14の1列目3列目の文字「t」に接続する。また、ポインタ配列22の「Data」と値「1」を接続する。そして、トライ木生成部150aは、入力キーのポインタを、テキスト表14の2行目3列目の「t」に接続する。また、ポインタ配列21の「Data」に接続されていた値「2」を入力値に保持する(ステップS20b)。
続いて、図20に移行する。トライ木生成部150aは、入力キー「http://aaa.aaa/e/c/」の3文字目に対応するノードtが、ノードtの配下に存在しないので、ノードtの配下に新たなノードtを生成する。ここで、各ノードtを区別するために以下の説明では、親側のノードtをノードt(親)と表記し、子側のノードtをノードt(子)と表記する。また、トライ木生成部150aは、入力キーのポインタを3文字目の「p」に設定する(ステップS21a)。
実データ上において、トライ木生成部150aは、ノードt(子)に対応するポインタ配列23を生成し、ポインタ配列22のキー番号「0×74」で、ポインタ配列22とポインタ配列23を接続する。また、トライ木生成部150aは、入力キーのポインタを、テキスト表14の2行目4列目の「p」に接続する(ステップS21b)。
続いて、図21に移行する。トライ木生成部150aは、入力キー「http://aaa.aaa/e/c/」からトライ部分「htt」を取り除いた残りのキー「p://aaa.aaa/e/c/」をノードt(子)に接続する。また、トライ木生成部150aは、入力キー「http://aaa.aaa/e/c/」に対応する値「2」をノードt(子)に接続する(ステップS22a)。
実データ上において、トライ木生成部150aは、ポインタ配列23の「TAG」をテキスト表14の2行目4列目の「p」に接続し、入力キーのポインタを開放する。また、トライ木生成部150aは、ポインタ配列23の「Data」に値「2」を接続する(ステップS22b)。
続いて、図22に移行し、ステップS22a、22bにおいて作成したトライ木に、キー「http://aaa.aaa/e/」、値「4」を追加する場合について説明する。トライ木生成部150aは、入力キー「http://aaa.aaa/e/」の先頭から文字を順次読み出し、ノードh、t(親)、t(子)に遷移する。そして、トライ木生成部150aは、入力キー「http://aaa.aaa/e/」のポインタを4文字目の「p」に設定する(ステップS23a)。
実データ上において、トライ木生成部150aは、テキスト表14に最後に登録されたキー「http://aaa.aaa/e/d/」との間を1つ空けて、キー「http://aaa.aaa/e/」を登録する。そして、トライ木生成部150aは、テキスト表14の4行目6列目の文字「p」に入力キーのポインタを接続する(ステップS23b)。
続いて、図23に移行する。トライ木生成部150aは、ノードt(子)において、「p」をキーとする子ノードが存在しないので、ノードt(子)のタグキー「p://aaa.aaa/e/c/」の優先度と、トライ部分の「htt」を取り除いた入力キー「p://aaa.aaa/e/」の優先度を比較する。すると、入力キーの15文字目が「空」であり、タグキーの15文字目が「c」であるため、タグキーの優先度が入力キーよりも大きい。
したがって、トライ木生成部150aは、ノードt(子)のデータと、入力データとの交換を行わずに、ノードt(子)からノードt(親)に戻り、入力キー「http://aaa.aaa/e/」のポインタを3文字目の「t」に設定する(ステップS24a)。
実データ上において、トライ木生成部150aは、テキスト表14の4行目6列目の文字「p」に入力キーのポインタを接続する。また、トライ木生成部150aは、ポインタ配列23の「TAG」に接続された文字を先頭とする文字列と、入力キーのポインタに接続された文字を先頭とする文字列とを順次比較すると、入力キーの15文字目が「空」であり、タグキーの15文字目が「c」であるため、タグキーの優先度が入力キーよりも大きいと判定する。そして、トライ木生成部150aは、入力キーのポインタを、4行目5列目の「t」に設定する(ステップS24b)。
続いて、図24に移行する。トライ木生成部150aは、ノードt(親)のタグキー「tp://aaa.aaa/e/」の優先度と、トライ部分の「ht」を取り除いた入力キー「tp://aaa.aaa/e/」の優先度とを比較する。すると、入力キーとタグキーの優先度が等しい(入力キーとタグキーが同じ)である。この場合、トライ木生成部150aは、入力キー「http://aaa.aaa/e/」に対応する値「4」を、ノードtに追加する(ステップS25a)。
実データ上において、トライ木生成部150aは、テキスト表14の4行目5列目の文字「t」に入力キーのポインタを接続する。また、トライ木生成部150aは、ポインタ配列22の「TAG」に接続された文字を先頭とする文字列と、入力キーのポインタに接続された文字を先頭とする文字列とを順次比較すると、空に至るまでの各文字列が等しいため、タグキーの優先度と入力キーの優先度は等しい(タグキーと入力キーは同じ)と判定する。そして、トライ木生成部150aは、ポインタ配列22に「Data」に値「4」を追加する(ステップS25b)。
図15〜図24に示したように、トライ木生成部150aは、トライ木140bを生成する場合に、1つのノードに1つのキーを割当てるので、トライ木140bのメモリ使用量を削減することが出来る。また、トライ木生成部150aは、新規の入力キーをトライ木140bに割当てる場合に、全てのタグキーと入力キーを比較することはせず、比較対象ノードのタグキーのみと比較して、タグキーを新規に登録するので、処理負荷を軽減させつつ、深さ優先探索順でタグキーが並ぶようにトライ木140bを生成することが出来る。
なお、図15〜図24に示した実データに対応する各種データ(ポインタ配列、テキスト表等)は、記憶部140に記憶されているものとする。
図10の説明に戻ると、トライ木探索部150bは、トライ木140bに登録された値の集計値を抽出する処理、所定のキーに対応する値をトライ木140bから検索する処理を実行する処理部である。
まず、トライ木探索部150bが、トライ木140bに登録された値の集計値を抽出する処理について説明する。トライ木探索部150bは、指定された入力キーの文字を先頭から1文字ずつ読み出して、各ノードを辿り、ノードに登録されたタグキーおよび値を対応付けて順次出力することで、集計値を抽出する。ノードに複数の値が登録されている場合には、トライ木探索部150bは、各値を合計しても良いし、別々に出力しても良い。本実施例にかかるトライ木探索部150bは、一例として、各値を合計して出力する。
図25〜図27は、集計値を抽出する処理を説明するための図である。図25に示すように、トライ木140bは、ルートノードの配下に、ノードh、ノードt(親)、ノードt(子)が順に接続されている。ノードhは、タグキー「ttp://aaa.aaa/d/」、値「3」を登録し、ノードt(親)は、タグキー「tp://aaa.aaa/e」、値「1、4」を登録し、ノードt(子)は、タグキー「p://aaa.aaa/e/c」、値「2」を登録しているものとする。
また、図25〜図27における説明では、入力キー「http://aaa.aaa/e/」が指定された場合の集計値の抽出処理について説明する。図25において、トライ木探索部150bは、入力キー「http://aaa.aaa/e/」の1文字目をポインタに設定し、ポインタの文字にしたがって、ノードhに移行する。
ノードhは、タグキー「ttp://aaa.aaa/d/」、値「3」が登録されているので、トライ木探索部150bは、トライ部分「h」をタグキー「ttp://aaa.aaa/d/」の先頭に追加したキー「http://aaa.aaa/d/」と、値(合計値)「3」を出力する(ステップS30a)。
実データ上において、トライ木探索部150bは、テキスト表14の4行目3列目に入力キー「http://aaa.aaa/d/」を登録し、入力キーのポインタを4行目3列目に接続する。また、トライ木探索部150bは、現在のノードのポインタをポインタ配列21に接続する。また、トライ木探索部150bは、ノードhに対応するポインタ配列21の「TAG」に接続された文字の前後空までの文字列「http://aaa.aaa/d/」と、「Data」に接続された値「3」を出力する(ステップS30b)。
図26の説明に移行する。トライ木探索部150bは、入力キー「http://aaa.aaa/e/」の2文字目をポインタに設定し、ポインタの文字にしたがって、ノードhからノードt(親)に移行する。ノードt(親)は、タグキー「tp://aaa.aaa/e/」、値「1、4」が登録されているので、トライ木探索部150bは、トライ部分「ht」をタグキー「tp://aaa.aaa/e/」の先頭に追加したキーと、値「1、4」を合計した値「5」を出力する(ステップS31a)。
実データ上において、トライ木探索部150bは、入力キーのポインタ接続先を1文字ずらし、テキスト表14の4行目4列目の文字「t」に接続する。また、トライ木探索部150bは、現在のノードのポインタをポインタ配列22に接続する。また、トライ木探索部150bは、ノードt(親)に対応するポインタ配列22の「TAG」に接続された文字の前後空までの文字列「http://aaa.aaa/e/」と、「Data」に接続された値「1、4」の合計値「5」を出力する(ステップS31b)。
図27の説明に移行する。トライ木探索部150bは、入力キー「http://aaa.aaa/e/」の3文字目をポインタに設定し、ポインタの文字にしたがって、ノードt(親)からノードt(子)に移行する。ノードt(子)は、タグキー「p://aaa.aaa/e/c/」、値「2」が登録されているので、トライ木探索部150bは、トライ部分「htt」をタグキー「tp://aaa.aaa/e/c/」の先頭に追加したキーと、値(合計値)「2」を出力する(ステップS32a)。
実データ上において、トライ木探索部150bは、入力キーのポインタ接続先を1文字ずらし、テキスト表14の4行目5列目の文字「t」に接続する。また、トライ木探索部150bは、現在のノードのポインタをポインタ配列23に接続する。また、トライ木探索部150bは、ノードt(子)に対応するポインタ配列23の「TAG」に接続された文字の前後空までの文字列「http://aaa.aaa/e/c/」と、「Data」に接続された値(合計値)「2」を出力する(ステップS32b)。
図25〜図27に示したように、入力キーを順次読み出し、トライ木140bを辿ることで、入力キーに対応する集計値を出力することが出来る。
次に、トライ木探索部150bが、指定された入力キーに対応する値をトライ木140bから検索する処理について説明する。トライ木探索部150bは、トライ木140bが、深さ優先探索順でタグキーが並ぶように生成されているので、比較対象ノードに登録されたタグキーと入力キーを比較すればよい。また、比較対象ノードに含まれる各ノードと入力キーを比較する場合に、二分探索法を用いることで、更に処理負荷を軽減させることが出来る。
以下において、二分探索法を用いた場合の検索処理について説明する。図28〜図31は、二分探索法を用いた場合の検索処理を説明するための図である。図28に示すように、トライ木140bは、ルートノードの配下に、ノードh、ノードt(親)、ノードt(子)が順に接続されている。ノードhは、タグキー「ttp://aaa.aaa/d/」、値「3」を登録し、ノードt(親)は、タグキー「tp://aaa.aaa/e」、値「1、4」を登録し、ノードt(子)は、タグキー「p://aaa.aaa/e/c」、値「2」を登録しているものとする。
また、図28〜図31における説明では、入力キー「http://aaa.aaa/d」が指定された場合の検索処理について説明する。図28において、トライ木探索部150bは、入力キー「http://aaa.aaa/d」の先頭文字から順に文字を読み出し、ルートノードからノードh、ノードt(親)、ノードt(子)の順に遷移する。そして、トライ木探索部150bは、入力キー「http://aaa.aaa/d」のポインタを初期位置の「h」から3文字ずらした「p」に設定する。また、遷移した各ノードにスタックを追加する(ステップS40a)。
実データ上では、トライ木探索部150bは、ノードh、ノードt(親)、ノードt(子)に対応するポインタ配列21、22、23にそれぞれスタックを追加する。また、トライ木探索部150bは、現在のノードのポインタをポインタ配列23に接続する(ステップS40b)。なお、ここでは、説明の便宜上、入力キー「http://aaa.aaa/d」の記載を省略するが、テキスト表14に入力キー「http://aaa.aaa/d」の情報が格納されているものとする。
続いて、図29の説明に移行する。トライ木探索部150bは、スタックの真ん中のノードt(親)に遷移し、入力キーのポインタを戻った分だけ戻す。ここでは、ノードt(子)からノードt(親)に戻っているので、入力キー「http://aaa.aaa/d」のポインタを「p」から1つ戻した「t(3文字目のt)」に設定する。
そして、トライ木探索部150bは、ノードtのタグキー「tp://aaa.aaa/e」の優先度と、トライ部分「ht」を取り除いた入力キー「tp://aaa.aaa/d」の優先度とを比較する。すると、入力キーの14文字目が「d」であり、タグキーの14文字目が「e」であるため、トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも大きいと判定する(ステップS41a)。ノードt(親)タグキーの優先度が入力キーの優先度よりも大きい場合には、ノードt(親)以降のノードには、検索対象となるタグキーが存在しない。
実データ上において、トライ木探索部150bは、スタックの真ん中に接続されたポインタ配列22に現在のノードのポインタを移動させる。そして、トライ木探索部150bは、ポインタ配列22の「TAG」に接続された文字以降の文字列「tp://aaa.aaa/e」と、トライ部分「ht」を除いた残りの入力キー「tp://aaa.aaa/d」とを比較する。すると、入力キーの14文字目が「d」であり、タグキーの14文字目が「e」であるため、トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも大きいと判定する(ステップS41b)。
続いて、図30の説明に移行する。図29で説明したように、ノードt(親)タグキーの優先度が入力キーの優先度よりも大きい場合には、ノードt(親)以降のノードには、検索対象となるタグキーが存在しない。したがって、トライ木探索部150bは、スタックの後半となる、ノードt(親)、ノードt(子)に追加されたスタックを削除する。
また、トライ木探索部150bは、スタックの真ん中のノードhに遷移し、入力キーのポインタを戻った分だけ戻す。子kでは、ノードt(親)からノードhに戻っているので、入力キー「http://aaa.aaa/d」のポインタを「t(3文字目)」から1つ戻した「t(2文字目)」に設定する(ステップS42a)。
実データ上において、トライ木生成部150aは、スタックの真ん中に接続されたポインタ配列21に現在のノードのポインタを移動させる(ステップS42b)。
図31の説明に移行する。トライ木探索部150bは、ノードhのタグキー「ttp://aaa.aaa/d」の優先度と、トライ部分「h」を取り除いた入力キー「ttp://aaa.aaa/d」の優先度を比較する。すると、タグキーと入力キーの優先度が等しい(タグキーと入力キーが同じ)ため、トライ木探索部150bは、ノードhに接続されたタグキー「ttp://aaa.aaa/d」の先頭にトライ部分「h」を追加したキー「http://aaa.aaa/d」と、値「3」を検索結果として出力する(ステップS43a)。
実データ上において、トライ木探索部150bは、ポインタ配列21の「TAG」に接続された文字以降の文字列「ttp://aaa.aaa/d」の優先度と、トライ部分「h」を取り除いた残りの入力キー「tp://aaa.aaa/d」の優先度を比較する。すると、タグキーと入力キーの優先度が等しい(タグキーと入力キーが同じ)ため、トライ木探索部150bは、ポインタ配列21の「TAG」に接続された文字の前後空までの文字列「http://aaa.aaa/d/」と、「Data」に接続された値「3」を出力する(ステップS43b)。
次に、図32〜図35において、その他の例を用いて、二分探索法を用いた場合の検索処理について説明する。図32に示すように、トライ木140bは、ルートノードの配下に、ノードa、ノードb、ノードcを接続している。ノードaは、タグキー「aa」、値「3」を登録し、ノードbは、タグキー「c」、値「1」を登録し、ノードcは、タグキー「b」、値「2」を登録しているものとする。なお、ノードbとノードcの関係は、ノードbが兄ノードであり、ノードcが弟ノードである。
また、図32〜図35における説明では、入力キー「ac」が指定された場合の検索処理について説明する。図32において、トライ木探索部150bは、入力キー「ac」から「a」を読み出し、入力キーのポインタを「a」から「c」にずらす。また、トライ木探索部150bは、ノードaにスタックを追加する(ステップS50a)。
実データ上では、トライ木探索部150bは、ノードaに対応するポインタ配列21にスタックを追加する。また、トライ木探索部150bは、現在のノードのポインタをポインタ配列21に接続する。トライ木探索部150bは、入力キーのポインタを、テキスト表14の1行目14列目の文字「c」に設定する(ステップS50b)。
続いて、図33の説明に移行する。トライ木探索部150bは、入力キー「ac」からポインタが指定する「c」を読み出し、ノードcに遷移する。ノードcに遷移した時点で、ノードaの先祖ノードに登録されたタグキーの優先度は、入力キー「ac」の優先度よりもすべて小さいものとなるため、検索対象から外す必要がある。したがって、トライ木探索部150bは、一旦スタックを空にし、スタックに新しくノードcを追加する。また、入力キーのポインタを「c」から1文字ずらし、ポインタを「空」に設定する(ステップS51a)。
実データ上では、トライ木探索部150bは、現在のノードをポインタ配列23に指定する。トライ木探索部150bは、ポインタ配列21に接続されたスタックを削除し、ポインタ配列23にスタックを追加する。また、トライ木探索部150bは、入力キーのポインタをテキスト表14の1行目15文字目の「空」に設定する(ステップS51b)。
続いて、図34の説明に移行する。トライ木探索部150bは、ポインタが指定する文字が「空」なので、スタックの真ん中のノードcを現在のノードに設定し、ノードcのタグキー「b」の優先度と、トライ部分「ac」を除いた「空」の優先度を比較する。トライ木探索部150bは、比較した結果、タグキーの優先度の方が入力キーの優先度よりも大きいと判定する(ステップS52a)。
実データ上では、トライ木探索部150bは、スタックの真ん中に対応するポインタ配列23に現在のノードを設定し、ポインタ配列23の「TAG」に接続された文字を先頭とする文字列と、入力キーのポインタに接続された「空」とを比較する。トライ木探索部150bは、比較した結果、タグキーの優先度の方が入力キーの優先度よりも大きいと判定する(ステップS52b)。
続いて、図35の説明に移行する。トライ木探索部150bは、タグキーの優先度の方が入力キーの優先度よりも大きいので、タグキーを登録するノードcのスタックを削除する。全てのスタックが無くなり、入力キー「ac」と一致するタグキーが存在しないので、トライ木探索部150bは、一致データが存在しない旨を出力する(ステップS53a)。
実データ上では、トライ木探索部150bは、タグキーの優先度の方が入力キーの優先度よりも大きいので、ノードcに対応するポインタ配列に接続されたスタックを削除する。全てのスタックが無くなり、入力キー「ac」と一致するタグキーが存在しないので、トライ木探索部150bは、一致データが存在しない旨を出力する(ステップS53b)。
上述した図28〜図35では、トライ木探索部150bが、二分探索法を用いて検索処理を実行する場合について説明したが、トライ木探索部150bは、必ずしも二分探索法を用いなくてもよい。図36〜図40は、二分探索法を用いない場合の探索処理を説明するための図である。図36に示すように、トライ木140bは、ルートノードの配下にノードb、ノードa、ノードb、ノードcが接続されている。ここで、各ノードbを区別するために、ルートノードの子ノードに対応するノードbをノードb(1)と表記し、もう一方のノードbをノードb(2)と表記する。
ノードb(1)は、タグキー「a」、値「1」を登録し、ノードaは、タグキー「aa」、値「3」を登録し、ノードb(2)は、タグキー「c」、値「1」を登録し、ノードcは、タグキー「b」、値「2」を登録しているものとする。
また、図36〜図40における説明では、入力キー「baca」が指定された場合の検索処理について説明する。図36において、トライ木探索部150bは、入力キーのポインタを先頭文字「b」に設定し、ポインタの指定する「b」により、ルートノードからノードb(1)に遷移する。そして、トライ木探索部150bは、入力キーのポインタを「b」から1文字ずらした「a」に設定する(ステップS60a)。
実データ上では、トライ木探索部150bは、テキスト表14に入力キー「baca」を登録し、入力キーのポインタをテキスト表14の2行目1列目の「b」に接続する。トライ木探索部150bは、入力キーのポインタに接続された「b」により、ポインタ配列20からポインタ配列21に現在のノードのポインタを遷移させ、入力キーのポインタを1文字ずらした「a」に設定する(ステップS60b)。
続いて、図37の説明に移行する。トライ木探索部150bは、ポインタの指定する「a」により、ノードb(1)からノードaに遷移し、入力キーのポインタを「a」から1文字ずらした「c」に設定する(ステップS61a)。
実データ上では、トライ木探索部150bは、入力キーのポインタに接続された「a」により、ポインタ配列21からポインタ配列22に現在のノードのポインタを遷移させ、入力キーのポインタを1文字ずらした「c」に設定する(ステップS61b)。
続いて、図38の説明に移行する。トライ木探索部150bは、ポインタの指定する「c」により、ノードaからノードcに遷移し、入力キーのポインタを「c」から1文字ずらした「a」に設定する(ステップS62a)。
実データ上では、トライ木探索部150bは、入力キーのポインタに接続された「c」により、ポインタ配列22からポインタ配列24に現在のノードのポインタを遷移させ、入力キーのポインタを1文字ずらした「a」に設定する(ステップS62b)。
図39の説明に移行する。トライ木探索部150bは、ポインタの指定する「a」に対応した子ノードが、ノードcに存在しないので、ノードcに登録されたタグキー「b」の優先度と、トライ部分「bac」を取り除いた入力キー「a」の優先度とを比較する。トライ木探索部150bは、比較した結果、入力キーの優先度よりもタグキーの優先度の方が大きいと判定する(ステップS63a)。
実データ上では、トライ木探索部150bは、ポインタ配列24の「TAG」に接続された文字「b」の優先度と、入力キーのポインタに接続された文字「a」の優先度を比較する。トライ木探索部150bは、比較した結果、入力キーの優先度よりもタグキーの優先度の方が大きいと判定する(ステップS63b)。
図40の説明に移行する。トライ木探索部150bは、ノードcが兄ノード(ノードb(2))を有するので、ノードcより前のノード(ノードa、ノードb(1))に、入力キーと一致するタグキーを有するノードは存在しないと判定する。トライ木探索部150bは、該当データが無い旨を出力する(ステップS64)。
ところで、トライ木探索部150bは、トライ木140bに対して削除するキーを指定された場合に、指定された入力キーをトライ木140bから削除する。図41は、削除処理を説明するための図である。ここでは、図41の左側に示すトライ木からタグキー「black」、値「1」を削除する場合について説明する。
まず、トライ木探索部150bは、上述した探索処理と同様にして、入力キー「black」と同じタグキーを有するノードlを探索し、ノードlに登録されたタグキー「ack」と値「1」を削除する。
そして、トライ木探索部150bは、ノードlの長男ノードとなるノードuのタグキー「e(blue)」、値「4」をノードlに登録する。また、トライ木探索部150bは、ノードuの長男ノードとなるノードeのタグキー「blueviolet」、値「3」をノードuに登録し、ノードeをトライ木から削除する。トライ木探索部150bが、図41の左側に示すトライ木からキー「black」、値「1」を削除することで、図41の右側に示すトライ木が生成される。
次に、本実施例1にかかる検索装置100の各種の処理手順について説明する。まず、本実施例1にかかる検索装置100がトライ木140bを生成する処理について説明する。図42は、本実施例1にかかるトライ木生成処理の処理手順を示すフローチャートである。
図42に示すように、トライ木生成部150aは、ルートノードを生成し(ステップS101)、次の入力データ(キー、値)が登録データ管理テーブル140aに存在するか否かを判定する(ステップS102)。
トライ木生成部150aは、次の入力データが登録データ管理テーブル140aに存在しないと判定した場合には(ステップS103,No)、処理を終了する。一方、トライ木生成部150aは、次の入力データが登録データ管理テーブルに登録されている場合には(ステップS103,Yes)、未読の入力データを読み出し(ステップS104)、データ追加処理を実行する(ステップS105)。
次に、図42のステップS105に示したデータ追加処理の処理手順について説明する。ここでは、二分探索法を用いないでデータ追加処理を実行する場合と、二分探索法を用いてデータ追加処理を実行する場合に分けて説明する。
図43および図44は、二分探索法を用いないデータ追加処理の処理手順を示すフローチャートである。図43に示すように、トライ木生成部150aは、現在のノードをルートノードに設定し(ステップS150)、入力キーが空であるか否かを判定する(ステップS151)。
トライ木生成部150aは、入力キーが空ではない場合には(ステップS152,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS153)。トライ木生成部150aは、子ノードが存在する場合には(ステップS154,Yes)、入力キーの先頭の1文字を読取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードに遷移し(ステップS155)、ステップS151に移行する。
一方、トライ木生成部150aは、子ノードが存在しない場合には(ステップS154,No)、ステップS156に移行する。
ところで、ステップS152において、入力キーが空の場合には(ステップS152,Yes)、ノードの情報を参照し(ステップS156)、タグキーの優先度が入力キーの優先度と等しい(タグキーが入力キーと等しい)か否かを判定する(ステップS157)。タグキーの優先度と入力キーの優先度が等しい場合には(ステップS158,Yes)、トライ木生成部150aは、現在のノードに入力値(入力キーに対応する値)を追加し(ステップS159)、データ追加処理を終了する。
一方、タグキーの優先度と入力キーの優先度が異なる場合には(ステップS158,No)、トライ木生成部150aは、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS160)。タグキーの優先度が入力キーの優先度よりも小さい場合には(ステップS161,No)、ステップS164に移行する。
タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS161,Yes)、兄ノードが存在する、または、親ノードがルートノードであるか否かを判定する(ステップS162)。兄ノードが存在せず、かつ、親ノードがルートノードではない場合には(条件を満たさない場合には)(ステップS163,No)、入力キーのポインタを1文字戻し、親ノードへ遷移し(ステップS164)、ステップS160に遷移する。
一方、兄ノードが存在する、または、親ノードがルートノードの場合(条件を満たす場合)には(ステップS163,Yes)、現在のノードのタグキー、値と入力キー、入力値をそれぞれ交換し(ステップS168)、ステップS165に移行する。
ところで、トライ木生成部150aは、ステップS161において、タグキーの優先度が入力キーの優先度よりも小さい場合には(ステップS161,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS165)。
子ノードが存在する場合には(ステップS166,Yes)、トライ木生成部150aは、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードへ遷移し(ステップS167)、ステップS168に移行する。
一方、子ノードが存在しない場合には(ステップS166,No)、トライ木生成部150aは、新しいノードを生成し(ステップS169)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして、現在のノードから新しいノードへ接続する(ステップS170)。
トライ木生成部150aは、入力キーをタグキーとして新しいノードに付加し(ステップS171)、入力値を新しいノードに付加し(ステップS172)、データ追加処理を終了する。
図45〜図47は、二分探索法を用いるデータ追加処理の処理手順を示すフローチャートである。トライ木生成部150aは、現在のノードをルートノードに設定し(ステップS180)、入力キーが空であるか否かを判定する(ステップS181)。
入力キーが空の場合には(ステップS182,Yes)、トライ木生成部150aは、ステップS190に移行する。一方、入力キーが空ではない場合には(ステップS182,No)、トライ木生成部150aは、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS183)。
子ノードが存在する場合には(ステップS184,Yes)、トライ木生成部150aは、子ノードが長男であるか否かを判定し(ステップS185)、子ノードが長男の場合には(ステップS186,Yes)、ステップS188に移行する。
一方、子ノードが長男ではない場合には(ステップS186,No)、トライ木生成部150aは、スタックを空に設定し(ステップS187)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードへ遷移する(ステップS188)。トライ木生成部150aは、遷移したノードをスタックに追加し(ステップS189)、ステップS181に移行する。
ところで、トライ木生成部150aは、ステップS184において、子ノードが存在しない場合には(ステップS184,No)、スタックが空であるか否かを判定し(ステップS190)、スタックが空の場合には(ステップS191,No)、スタックの真ん中のデータを現在のノードとし、入力キーのポインタを移動した分だけ、ずらす(ステップS192)。
図46に移行する。トライ木生成部150aは、タグキーの優先度と入力キーの優先度が等しいか否かを判定し(ステップS193)、タグキーの優先度と入力キーの優先度が等しい場合には(ステップS194,Yes)、現在のノードに入力値を追加する(ステップS195)。
一方、トライ木生成部150aは、タグキーの優先度と入力キーの優先度が異なる場合には(ステップS194,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS196)。
トライ木生成部150aは、タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS197,Yes)、真ん中のスタックを含む、スタックの後半を削除し(ステップS199)、図45のステップS190に移行する。
一方、トライ木生成部150aは、タグキーの優先度が入力キーの優先度よりも小さい場合には(ステップS197,No)、真ん中のスタックを含む、スタックの前半を削除し(ステップS198)、図45のステップS190に移行する。
ところで、図45のステップS191において、スタックが空の場合には(ステップS191,Yes)、図47に移行し、トライ木生成部150aは、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS200)。
トライ木生成部150aは、子ノードが存在する場合には(ステップS201,Yes)、入力キーの先頭1文字を読み取り、残り入力キーのポインタを1文字進め、読み出した文字をキーとして、子ノードに遷移する(ステップS202)。そして、トライ木生成部150aは、現在のノードのタグキー、値と入力キー、入力値をそれぞれ交換し(ステップS203)、ステップS200に移行する。
一方、トライ木生成部150aは、子ノードが存在しない場合には(ステップS201,No)、新しいノードを生成し(ステップS204)、入力キーの先頭1文字を読み取り、残り入力キーのポインタを1文字進め、読み出した文字をキーとして、現在のノードから新しいノードへ接続する(ステップS205)。トライ木生成部150aは、入力キーをタグキーとして新しいノードに付加し(ステップS206)、入力値を新しいノードに付加する(ステップS207)。
次に、本実施例にかかる検索装置100がトライ木140bを用いて検索を行う処理について説明する。ここでは、二分探索法を用いないで検索処理を実行する場合と、二分探索法を用いて検索処理を実行する場合について説明する。
まず、二分探索法を用いない検索処理の処理手順について説明する。図48は、二分探索法を用いない検索処理の処理手順を示すフローチャートである。図48に示すように、トライ木探索部150bは、現在のノードをルートノードに設定し(ステップS300)、入力キーが空であるか否かを判定する(ステップS301)。
トライ木探索部150bは、入力キーが空の場合には(ステップS302,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS303)。トライ木探索部150bは、子ノードが存在しない場合には(ステップS304)、ステップS306に移行する。
一方、トライ木探索部150bは、子ノードが存在する場合には(ステップS304,Yes)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードに遷移し(ステップS305)、ステップS301に移行する。
ところで、ステップS302において、入力キーが空の場合には(ステップS302,Yes)、トライ木探索部150bは、ノードの情報を参照し、タグキーの優先度と入力キーの優先度が等しいか否かを判定する(ステップS306)。トライ木探索部150bは、タグキーの優先度と入力キーの優先度が等しい場合には(ステップS307,Yes)、現在のノードのデータ(値)を出力する(ステップS308)。
一方、タグキーの優先度と入力キーの優先度が異なる場合には(ステップS307,No)、トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS309)。トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも小さい場合には(ステップS310,No)、ステップS314に移行する。
一方、タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS310,Yes)、トライ木探索部150bは、兄ノードが存在するか、または、親ノードがルートノードであるか否かを判定する(ステップS311)。
トライ木探索部150bは、兄ノードが存在しないで、かつ、親ノードがルートノードではない場合(条件を満たさない場合)に(ステップS312,No)、入力キーのポインタを1文字戻し、親ノードへ遷移する(ステップS313)。
一方、トライ木探索部150bは、兄ノードが存在するか、または、親ノードがルートノードの場合(条件を満たす場合)に(ステップS312,Yes)、一致するデータが存在しない旨を出力する(ステップS314)。
続いて、二分探索法を用いる検索処理の処理手順について説明する。図49および図50は、二分探索法を用いる検索処理の処理手順を示すフローチャートである。図49に示すように、トライ木探索部150bは、現在のノードをルートノードに設定し(ステップS350)、入力キーが空であるか否かを判定する(ステップS351)。
トライ木探索部150bは、入力キーが空の場合には(ステップS352,Yes)、図50のステップS360に移行する。一方、トライ木探索部150bは、入力キーが空ではない場合に(ステップS352,No)、入力キーの先頭文字のキーで、子ノードが存在するか否かを判定する(ステップS353)。
トライ木探索部150bは、子ノードが存在しない場合には(ステップS354,No)、図50のステップS360に移行する。一方、トライ木探索部150bは、子ノードが存在する場合に(ステップS354,Yes)、子ノードが長男であるか否かを判定する(ステップS355)。
トライ木探索部150bは、子ノードが長男である場合には(ステップS356,Yes)、ステップS358に移行する。一方、トライ木探索部150bは、子ノードが長男ではない場合に(ステップS356,No)、スタックを空に設定する(ステップS357)。
トライ木探索部150bは、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードに遷移する(ステップS358)。そして、トライ木探索部150bは、遷移したノードをスタックに追加し(ステップS359)、ステップS351に移行する。
ところで、トライ木探索部150bは、ステップS352において、入力キーが空の場合(ステップS352,Yes)、または、ステップS354において、子ノードが存在しない場合(ステップS354,No)には、図50のステップS360に移行する。
図50において、トライ木探索部150bは、スタックが空であるか否かを判定し(ステップS360)、スタックが空の場合には(ステップS361,Yes)、一致データが無い旨の情報を出力する(ステップS362)。
一方、トライ木探索部150bは、スタックが空ではない場合に(ステップS361,No)、スタックの真ん中のノードを現在のノードとし、入力キーのポインタを移動した分だけ、ずらす(ステップS363)。
トライ木探索部150bは、タグキーの優先度と入力キーの優先度が等しいか否かを判定し(ステップS364)、タグキーの優先度と入力キーの優先度が等しい場合には(ステップS365,Yes)、現在のノードのデータ(値)を出力する(ステップS366)。
一方、トライ木探索部150bは、タグキーの優先度と入力キーの優先度が異なる場合には(ステップS365,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS367)。
トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも小さい場合には(ステップS368,No)、真ん中のスタックを含むスタックの前半を削除し(ステップS369)、ステップS360に移行する。
一方、トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS368,Yes)、真ん中のスタックを含むスタックの後半を削除し(ステップS370)、ステップS360に移行する。
次に、検索装置100が、集計値を抽出する処理について説明する。図51は、集計値の抽出処理の処理手順を示すフローチャートである。図51に示すように、このトライ木探索部150bは、現在のノードをルートノードに設定し(ステップS400)、子ノードが存在するか否かを判定する(ステップS401)。
トライ木探索部150bは、子ノードが存在する場合には(ステップS402,Yes)、各子ノードのうち、長男ノードへ遷移し(ステップS403)、現在のノードの各種データを加工し出力し(ステップS404)、ステップS401に移行する。ステップS404において、トライ木探索部150bは、例えば、長男ノードに複数の値が登録されている場合には、各値を加算する処理をおこない、加算した値を出力する。
一方、子ノードが存在しない場合には(ステップS402,No)、トライ木探索部150bは、弟ノードが存在するか否かを判定し(ステップS405)、弟ノードが存在する場合には(ステップS406,Yes)、次の弟ノードへ遷移し(ステップS407)、ステップS404に移行する。
一方、トライ木探索部150bは、弟ノードが存在しない場合には(ステップS406,No)、親ノードへ遷移し(ステップS408)、現在のノードがルートノードであるか否かを判定する(ステップS409)。
トライ木探索部150bは、現在のノードがルートノードでない場合には(ステップS410,No)、ステップS405に移行する。一方、トライ木探索部150bは、現在のノードがルートノードの場合に(ステップS410,Yes)、処理を終了する。
次に、検索装置100が、トライ木140bのデータを削除する削除処理について説明する。図52および図53は、削除処理の処理手順を示すフローチャートである。図52に示すように、トライ木探索部150bは、現在のノードをルートノードに設定し(ステップS450)、入力キーが空か否かを判定する(ステップS451)。
トライ木探索部150bは、入力キーが空ではない場合に(ステップS452,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS453)。トライ木探索部150bは、子ノードが存在しない場合には(ステップS454,No)、ステップS456に移行する。
一方、トライ木探索部150bは、子ノードが存在する場合に(ステップS454,Yes)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードに遷移し(ステップS455)、ステップS451に移行する。
ところで、ステップS452において、トライ木探索部150bは、入力キーが空の場合に(ステップS452,Yes)、ノードの情報を参照し、タグキーの優先度が入力キーの優先度と等しいか否かを判定する(ステップS456)。
トライ木探索部150bは、タグキーの優先度と入力キーの優先度が等しくない場合に(ステップS457,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS458)。トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも小さい場合に(ステップS459,No)、ステップS463に移行する。
トライ木探索部150bは、タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS459,Yes)、兄ノードが存在、あるいは、親ノードがルートノードであるか否かを判定する(ステップS460)。
トライ木探索部150bは、兄ノードが存在せず、かつ、親ノードがルートノードではない場合(条件を満たさない場合)に(ステップS461,No)、入力キーのポインタを1文字戻し、親ノードへ遷移し(ステップS462)、ステップS456に移行する。
一方、トライ木探索部150bは、兄ノードが存在する、または、親ノードがルートノードの場合に(ステップS461,Yes)、削除データが存在しない旨を出力する(ステップS463)。
ところで、ステップS457において、トライ木探索部150bは、タグキーの優先度が入力キーの優先度と等しい場合に(ステップS457,Yes)、図53のステップS464に移行する。
トライ木探索部150bは、削除対象のデータ(値)が存在するか否かを判定し(ステップS464)、削除対象のデータが存在しない場合には(ステップS465,No)、削除データが存在しない旨を出力する(ステップS466)。
一方、トライ木探索部150bは、削除対象のデータが存在する場合に(ステップS465,Yes)、他のデータ(値)が存在するか否かを判定する(ステップS467)。トライ木探索部150bは、他のデータが存在する場合に(ステップS468,Yes)、処理を終了する。
一方、トライ木探索部150bは、他のデータが存在しない場合に(ステップS468,No)、子ノードが存在するか否かを判定する(ステップS469)。トライ木探索部150bは、子ノードが存在しない場合に(ステップS470,No)、親ノードの現在のノードへのエッジを削除(接続を解除)し、現在のノードを削除する(ステップS471)。
一方、トライ木探索部150bは、子ノードが存在する場合に(ステップS470,Yes)、現在のノードのデータを長男ノードのデータとし(ステップS472)、長男ノードへ遷移し(ステップS473)、ステップS469に移行する。
上述してきたように、本実施例にかかる検索装置100は、トライ木生成部150aがトライ木140bを作成する場合に、1ノードにタグキーを1つ対応付け、タグキーを有さないノードを無くすので、メモリ使用効率を向上させることが出来る。
また、本実施例にかかる検索装置100は、トライ木生成部150aがトライ木140bの各ノードにタグキーを登録する場合に、優先度の低いタグキーをルートノード側のタグキーに登録するので、トライ木探索部150bが検索処理などを実行する場合に、比較対象となるノードの領域を絞り込むことができ、検索処理にかかる処理効率を向上させることが出来る。
まず、本実施例1にかかる検索装置100の課題を説明する。図54は、本実施例1にかかる検索装置100の課題を説明するための図である。図54の上段に示すトライ木は、ルートノードに、ノードh、ノードt(親)、ノードt(子)、ノードp、ノード:、ノード/が順に接続されている。
また、図54の上段に示すトライ木は、優先度の小さいタグキーから順に、各ノードに登録されている。ノードhはタグキー「ttp://aaa.aaa/e/」を有し、ノードt(親)はタグキー「tp://aaa.aaa/e/c/」を有し、ノードt(子)はタグキー「p://aaa.aaa/g/」を有する。ノードpはタグキー「://aaa.aaa/h/」を有し、ノード:はタグキー「//aaa.aaa/k/」を有し、ノード/はタグキー「/aaa.aaa/m/」を有する。
図54に示すように、各ノードに登録するタグキーの内、先頭文字列が一致しているタグキーが多いと、トライ木が深くなってしまい、トライ木に新しいキーを登録してトライ木を再構築する場合の処理が多くなってしまうという問題がある。
図54の下段は、図54の上段に示したトライ木に、キー「http://aaa.aaa/b/」を登録した場合のトライ木を示す。ここで、入力キー「http://aaa.aaa/b/」からトライ部分「h」を削除したキー「ttp://aaa.aaa/b/」の優先度は、ノードhのタグキー「ttp://aaa.aaa/e/」の優先度よりも小さい。
したがって、検索装置100は、ノードhにキー「ttp://aaa.aaa/b/」をタグキーとして登録し、ノードhに登録されていたキー「(ht)tp://aaa.aaa/e/」を子ノードのノードt(親)のタグキーとして登録する。同様に、ノードt(親)〜ノード/に登録されていたタグキーも、子ノードに順次登録する。
この場合、ノードhに新たなキーを登録したので、ノードh〜ノード/に登録されていたタグキーを更新すると共に、ノードh〜ノード/に登録されていたタグキーを子ノードに再接続する必要があるため、検索装置100が実行すべき処理が多くなり、迅速にトライ木の再構築処理を実行することが出来ないという課題が存在する。
次に、本実施例2にかかる検索装置の概要について説明する。図55は、本実施例2にかかる検索装置の概要を説明するための図である。本実施例2にかかる検索装置は、実施例1の検索装置100の課題を解消するべく、入力キーの文字列を固定長で分割し、階層的なトライ木を構築する。
図55の上段に示すように、本実施例2にかかるトライ木は、各階層にルートノードが存在し、ルートノードに接続されるノードには、6文字毎にタグキーを接続している。ルートノードaは、ノードh、ノードtを順に接続し、ノードhはタグキー「ttp://」を有し、ノードtはタグキー「tps:/」を有する。
タグキー「ttp://」はルートノードbに接続し、ルートノードbはノードaに接続する。ノードaは、タグキー「a.aaa/」に接続する。タグキー「tps:/」はルートノードcに接続し、ルートノードcはノード/に接続する。ノード/(1)は、タグキー「b.b」に接続する。
タグキー「a.aaa/」はルートノードdに接続し、ルートノードdは、ノードe、ノードg、ノードh、ノードk、ノードmに接続する。ノードeはタグキー「/」を登録し、ノード/(2)に接続する。ノード/(2)はタグキー「c/」を登録し、ノードgはタグキー「/」を登録する。ノードhはタグキー「/」を登録し、ノードkはタグキー「/」を登録し、ノードmはタグキー「/」を登録する。
図55に示すように、入力キーの文字列を固定長で分割し、階層的なトライ木を構築すると、新規のキーを登録してトライ木の再構築を実行する場合に、再接続するタグキーの数、更新するタグキーの数を大幅に削減することが出来る。
図55の下段は、図55の上段に示したトライ木に、キー「http://aaa.aaa/b/」を登録した場合のトライ木を示す。本実施例2にかかる検索装置は、入力キー「http://aaa.aaa/b/」を1文字ずつ読み出し、トライ木を辿ると、ルートノードa、ノードh、タグキー「ttp://」、ルートノードb、ノードa、タグキー「a.aaa/」、ルートノードdの順に遷移する。
検索装置は、ルートノードdにおいて、遷移先となるノード「b」が存在しないので、ノードbを新規に作成し、入力キーからトライ部分「http://aaa.aaa/b」を除いた残りのキー「/」をノードbに接続する。この際、タグキーの再接続、更新処理は、ルートノードdの存在する階層のみで実行すればよく、ルートノードa、b、cの存在する階層において、タグキーの再接続、更新処理を実行する必要はない。
このように、本実施例2にかかる検索装置は、固定長の文字列をタグキーとしてノードに接続し、固定長の文字列の配下(固定長の文字列を有するノードの配下)に新たにルートノードを作成して、トライ木を各階層に区切っている。したがって、トライ木の再構築を実行する場合には、ノードに接続するタグキーおよび更新するタグキーを該当する階層内のみで実行すればよいので、再接続するタグキーの数、更新するタグキーの数を大幅に削減することが出来る。
次に、本実施例2にかかる検索装置200の構成について説明する。図56は、本実施例2にかかる検索装置200の構成を示す図である。図56に示すように、この検索装置200は、入力部210と、出力部220と、入出力制御部230と、記憶部240と、制御部250を有する。
このうち、入力部210は、入力キー等の情報を入力する入力部であり、キーボードやマウス等に該当する。出力部220は、トライ木を用いた検索結果などの情報を出力する出力部であり、モニタ、若しくはディスプレイ、タッチパネル等に該当する。入出力制御部230は、入力部210、出力部220、記憶部240、制御部250によるデータの入出力を制御する処理部である。
記憶部240は、制御部250による各種処理に必要なデータおよびプログラムを記憶する記憶部である。この記憶部240は、登録データ管理テーブル240a、トライ木240bを有する。
ここで、登録データ管理テーブル240aは、トライ木に登録するキーと値を対応付けて記憶するテーブルである。図57は、本実施例2にかかる登録データ管理テーブル240aのデータ構造の一例を示す図である。図57に示すように、この登録データ管理テーブル240aは、キーと値を対応付けて記憶している。
トライ木240bは、登録データ管理テーブル240aを基にして生成されるトライ木である。図58は、本実施例2にかかるトライ木のデータ構造の一例を示す図である。図58では、一例として、図57に示した登録データ管理テーブル240aに対応したトライ木を示す。
図58に示すように、ルートノードaがノードdを接続し、ノードdがルートノードbを接続し、ルートノードbがノードb、ノードcを接続する。ノードdはタグキー「ark」を有し、ノードbはタグキー「lue」と値「2」を有する。ノードcはタグキー「yan」と値「1、3」を有する。
図58に示したトライ木を実データで表すと図59に示すデータ構造となる。図59は、図58に示したトライ木を実データで表した場合のデータ構造の一例を示す図である。図59に示すように、このトライ木240bは、ポインタ配列30〜34、テキスト表35を有している。
テキスト表35は、登録データ管理テーブル240aに登録された各キーを記憶するテーブルである。検索装置200は、各キーをテキスト表35に記憶する場合に、各キーの間に空欄を設ける。また、検索装置200は、各キーにおいて、所定の文字列毎にカンマを登録する。図59に示す例では、4文字毎にカンマを設けている。
ルートノードポインタに接続するポインタ配列30は、図58のルートノードaに対応し、ポインタ配列31は図58のノードdに対応する。ポインタ配列32は図58のルートノードbに対応し、ポインタ配列33は図58のノードbに対応し、ポインタ配列34は図58のノードcに対応する。
ポインタ配列30〜34は、「Next」領域、「TAG」領域、「Data」領域を有している。「Next」領域は、1つ下の階層に位置するルートノードと接続するポインタである。例えば、ポインタ配列31の「Next」は、1つ下の階層に位置するルートノードbのポインタ配列32に接続している。
「TAG」は、テキスト表35の文字と対応付けることで、ノードに接続されたタグキーを表現する。例えば、ポインタ配列31は、テキスト表35の1行目1列目の「a」に接続しているので、「e」から次のカンマ(または空欄)までの文字列「ark」をタグキーとして指定している。また、「Data」は、値と対応付けることで、ノードに接続された値を表現する。例えば、ポインタ配列33は、値「2」に接続されている。
また、各ポインタ配列30〜34は、配下に接続されたポインタ配列を判定するためのキー番号(ポインタ)「0×00〜0×FF」を有している。例えば、ポインタ配列30のキー番号「0×64」が、ポインタ配列31に接続され、ポインタ配列32のキー番号「0×62」が、ポインタ配列33に接続され、ポインタ配列32のキー番号「0×63」が、ポインタ配列34に接続されている。
図56の説明に戻ると、制御部250は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する制御部である。図56に示すように、この制御部250は、トライ木生成部250a、トライ木探索部250bを有する。
トライ木生成部250aは、登録データ管理テーブル240aに登録されたキーに基づいて、トライ木240bを生成する処理部である。このトライ木生成部250aは、トライ木240aを生成する場合に、固定長の文字列をタグキーとしてノードに接続し、固定長の文字列を有するノードの配下に新たなルートノードを作成することで、トライ木を各階層に区切る。
また、トライ木生成部250aは、実施例1と同様にして、新規のノードをトライ木に追加する場合に、新規の文字列の文字を先頭から順に読み出して、トライ木240bのノードを辿り、辿ったノードのうち、兄ノードを有するノードの中で最下層に位置する特定ノードを特定する。トライ木生成部250aは、兄ノードが存在しない場合に、最下層のルートノードに接続された子ノードを特定ノードとする。
トライ木生成部250aは、特定ノードから、新規の文字列の文字を順に読み出すことで最終的に到達するノードまでの経路に含まれるノードの何れか、または、葉ノードの配下に新規のノードを追加して、新規の文字列をノードに登録する。
図60〜図76は、本実施例2にかかるトライ木を生成する処理を説明するための図である。ここでは説明の便宜上、キー「http://aaa.aaa/e/」、値「1」と、キー「http://aaa.aaa/」、値「2」と、キー「http://aaa.aaa/c/」、値「3」の順で、トライ木を生成する場合について説明する。
図60に示すように、まず、ノードが存在しない状態で、キー「http://aaa.aaa/e/」、値「2」を追加する場合について説明する。トライ木生成部250aは、ルートノードaを生成する(ステップS70a)。
実データ上において、トライ木生成部250aは、ルートノードaに対応するポインタ配列40を生成し、ルートノードポインタとポインタ配列40を接続する。また、ポインタ配列40は、ルートノードaに対応するので、「TAG」を空に接続する(ステップS70b)。
トライ木生成部250aは、入力キー「http://aaa.aaa/e/」を用意し、ポインタを入力キーの1文字目の「h」に設定する。(ステップS71a)。実データ上において、トライ木生成部250aは、テキスト表35に入力キー「http://aaa.aaa/e/」を格納し、n(nは自然数)文字毎にカンマで文字列を区切る。ここでは、一例として、7文字毎にカンマで文字列を区切るものとする。トライ木生成部250aは、入力キーのポインタを、テキスト表35の1行目1列目の「h」に接続する(ステップS71b)。
トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の先頭文字「h」をキーとする子ノードが存在しないので、ルートノードを参照する。ここで、ルートノードにタグキーは存在しないので、ルートノードのタグキーの優先度よりも、入力キー「http://aaa.aaa/e/」の優先度が大きくなる。
トライ木生成部250aは、ルートノードaの配下に「h」をキーとするノードを作成する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の現在のポインタの文字「h」から6文字目までの文字列「http://」を抽出し、抽出した文字列から「h」を除いた残りのキー「ttp://」をタグキーとして、ノードhに接続する(ステップS72a)。
実データ上において、トライ木生成部250aは、ノードhに対応するポインタ配列40を生成し、ポインタ配列40のキー番号「0×68」で、ポインタ配列40とポインタ配列41を接続する。また、トライ木生成部250aは、ポインタ配列41の「TAG」をテキスト表35の1行目2列目の「t」に接続する(ステップS72b)。
続いて、図61に移行する。トライ木生成部250aは、次の階層の入力キーがあり、次の階層へのリンクがないので、新規のルートノードbを生成し、ノードh(タグキー「ttp://」)の配下に接続する。トライ木生成部250aは、入力キーにおいて、現在のポインタを、現在の文字「h」から7文字目(カンマを除く)の「a」に設定する。
トライ木生成部250aは、ルートノードbの配下に「a」をキーとするノードaを生成する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の現在のポインタの文字「a」から6文字目までの文字列「aaa.aaa」を抽出し、抽出した文字列から「a」を除いた残りのキー「aa.aaa」をタグキーとして、ノードaに接続する(ステップS73a)。
実データ上において、トライ木生成部250aは、新規のルートノードbに対応するポインタ配列42を生成し、ポインタ配列41の「Next」で、ポインタ配列41とポインタ配列42を接続する。トライ木生成部250aは、入力キーのポインタを1行目9列目の「a」に接続する。
トライ木生成部250aは、ノードaに対応するポインタ配列43を生成し、ポインタ配列42のキー番号「0×61」で、ポインタ配列42とポインタ配列43を接続する。トライ木生成部250aは、ポインタ配列43の「TAG」をテキスト表35の1行目10列目に接続する(ステップS73b)。
続いて、図62に移行する。トライ木生成部250aは、次の階層の入力キーがあり、次の階層へのリンクがないので、新規のルートノードcを生成し、ノードa(タグキー「aa.aaa」)の配下に接続する。トライ木生成部250aは、入力キーにおいて、現在のポインタを、現在の文字「a」から7文字目(カンマを除く)の「/」に設定する。
トライ木生成部250aは、ルートノードcの配下に「/」をキーとするノード/を生成する。トライ木生成部250aは、入力キー「http://aaa.aaa/e/」の現在のポインタの文字「/」から最後までの文字列「/e/」を抽出し、抽出した文字列から「/」を除いた残りのキー「e/」をタグキーとして、ノード/に接続する。トライ木生成部250aは、入力キーのポインタを「e」に設定する(ステップS74a)。
実データ上において、トライ木生成部250aは、新規のルートノードcに対応するポインタ配列44を生成し、ポインタ配列43の「Next」で、ポインタ配列43とポインタ配列44を接続する。
トライ木生成部250aは、ノード/に対応するポインタ配列45を生成し、ポインタ配列44のキー番号「0×2f」で、ポインタ配列44とポインタ配列45を接続する。トライ木生成部250aは、ポインタ配列45の「TAG」をテキスト表35の1行目18列目の「e」に接続する(ステップS74b)。
続いて、図63の説明に移行する。トライ木生成部250aは、ノード/にタグキー「e/」を接続した時点で、入力キー「http://aaa.aaa/e/」に含まれる文字列の登録が完了する。トライ木生成部250aは、入力キーに対応する値「1」をノード/に接続する(ステップS75a)。実データ上において、トライ木生成部250aは、ポインタ配列45の「Data」に値「1」を登録する(ステップS75b)。
続いて、図64に移行し、ステップS75a、75bにおいて作成したトライ木に、キー「http://aaa.aaa/g/」、値「2」を追加する場合について説明する。トライ木生成部250aは、入力キー「http://aaa.aaa/g/」のポインタを先頭文字の「h」に設定し、ルートノードaからノードhへ遷移する。
トライ木生成部250aは、入力キーのポインタを1文字進め、2文字目の「t」に設定する。トライ木生成部250aは、「t」をキーとする子ノードがノードhに存在しないので、ノードhを参照する(ステップS76a)。
実データ上において、トライ木生成部250aは、テキスト表35に最後に登録されたキー「http://aaa.aaa/e/」との間を1つ空けて、キー「http://aaa.aaa/g/」を格納し、7文字毎にカンマで文字列を区切る。トライ木生成部250aは、現在のノードをポインタ配列41に接続し、入力キーのポインタをテキスト表35の2行目1文字目の「t」に接続する(ステップS76b)。
続いて、図65に移行する。トライ木生成部250aは、ノードhのタグキー「ttp://」と、入力キーの現在のポインタの文字「t」から5文字目「/」までの文字列「ttp://」を比較する。各キーが一致するので、トライ木生成部250aは、現在のノードをルートノードcに遷移させる(次の階層に遷移する)。トライ木生成部250aは、入力キーの現在のポインタを、8文字目(カンマを除く)の「a」に設定する(ステップS77a)。
実データ上において、トライ木生成部250aは、ポインタ配列41の「TAG」に接続された「t」から次のカンマまでの文字列「ttp://」と、入力キーのポインタに接続された「t」からカンマまでの文字列「ttp://」を比較する。各キーが一致するので、トライ木生成部250aは、現在のノードをポインタ配列42に接続し、入力キーのポインタをテキスト表35の2行目8列目の「a」に接続する(ステップS77b)。
続いて、図66に移行する。トライ木生成部250aは、ルートノードbからノードaに移行し、入力キーのポインタを9文字目(カンマを除く)の「a」に設定する。トライ木生成部250aは、「a」をキーとする子ノードがノードaに存在しないので、ノードaを参照する。トライ木生成部250aは、ノードaのタグキー「aa.aaa」と、入力キーの現在のポインタの文字「a」から5文字目「a」までの文字列「aa.aaa」比較する(ステップS78a)。
実データ上において、トライ木生成部250aは、現在のノードをポインタ配列43に接続する。トライ木生成部250aは、ポインタ配列43の「TAG」に接続された「a」から次のカンマまでの文字列「aa.aaa」と、入力キーのポインタに接続された「a」から次のカンマまでの文字列「aa.aaa」を比較する(ステップS78b)。
続いて、図67に移行する。ステップS78aで比較した結果、各キーが一致し、かつ、次の階層の入力キーがある。トライ木生成部250aは、次の階層の入力キーがあるので、次の階層に遷移し、ルートノードcに遷移する。トライ木生成部250aは、入力キーの現在のポインタを15文字目(カンマを除く)の「/」に設定する(ステップS79a)。
実データ上において、トライ木生成部250aは、ステップS78bで比較した結果、各キーが一致し、かつ、次の階層の入力キーがあるので、現在のノードをポインタ配列44に接続する。また、トライ木生成部250aは、入力キーのポインタをテキスト表35の2行目16列目の「/」に接続する(ステップS79b)。
続いて、図68に移行する。トライ木生成部250aは、キー「/」にてルートノードcからノード/に遷移し、入力キーの現在のポインタを1文字ずらした「g」に設定する。トライ木生成部250aは、ノード/において、キー「g」を遷移先とする子ノードが存在しないので、ノード/を参照する。トライ木生成部250aは、ノード/のタグキー「e/」と、入力キーの現在のポインタの文字「g」から最後までの文字列「g/」を比較する(ステップS80a)。
実データ上において、トライ木生成部250aは、現在のノードをポインタ配列45に接続する。トライ木生成部250aは、ポインタ配列45の「TAG」に接続された「e」から次の空まので文字列「e/」と、入力キーのポインタに接続された「g」から次の空までの文字列「g/」を比較する(ステップS80b)。
続いて、図69に移行する。トライ木生成部250aは、ステップS80aで比較した結果、タグキーの優先度が入力キーの優先度よりも小さいと判定する。したがって、トライ木生成部250aは、入力キーのポインタに指定された文字「g」をキーとするノードgを生成し、ノード/に接続する。
トライ木生成部250aは、入力キーのポインタを1文字ずらして「/」に設定し、入力キーのポインタで指定する文字以降の文字「/」をノードgにタグキーとして接続する。また、トライ木生成部250aは、入力キーに対応する値「2」をノードgに接続する(ステップS81a)。
実データ上において、トライ木生成部250aは、ステップS80aで比較した結果、タグキーの優先度が入力キーの優先度よりも小さいと判定する。したがって、トライ木生成部250aは、ノードgに対応するポインタ配列46を生成する。トライ木生成部250aは、ポインタ配列45のキー番号「0×67」で、ポインタ配列45とポインタ配列46を接続する。
トライ木生成部250aは、ポインタ配列46の「TAG」をテキスト表35の2行目8列目の「/」に接続する。トライ木生成部250aは、ポインタ配列46の「Data」に入力キーに対応する値「2」を格納する(ステップS81b)。
続いて、図70に移行し、ステップS81a、ステップ81bにおいて作成したトライ木に、キー「http://aaa.aaa/c/」、値「3」を追加する場合について説明する。トライ木生成部250aは、入力キー「http://aaa.aaa/c/」のポインタを先頭文字の「h」に設定し、ルートノードaからノードhに遷移する。
トライ木生成部250aは、入力キーのポインタを1文字進めて2文字目の「t」に設定する。トライ木生成部250aは、「t」をキーとする子ノードがノードhに存在しないので、ノードhを参照する。また、トライ木生成部250aは、ノードhのタグキー「ttp://」と、入力キーの現在のポインタの文字「t」から5文字目「/」までの文字列「ttp://」を比較する(ステップS82a)。
実データ上において、トライ木生成部250aは、テキスト表35に最後に登録されたキー「http://aaa.aaa/g/」との間を1つ空けて、キー「http://aaa.aaa/c/」を格納し、7文字毎にカンマで文字列を区切る。トライ木生成部250aは、現在のノードをポインタ配列41に接続し、入力キーのポインタをテキスト表35の2行目11列目の「t」に接続する。
トライ木生成部250aは、ポインタ配列41の「TAG」に接続された「t」から次のカンマまでの文字列「ttp://」と、入力キーのポインタに接続された文字「t」から5文字目「/」までの文字列「ttp://」を比較する(ステップS82b)。
続いて、図71に移行する。トライ木生成部250aは、ステップS82aで比較した結果、タグキーと入力キーが一致し、かつ、次の階層の入力キーがある。トライ木生成部250aは、次の階層の入力キーがあるので、次の階層に遷移し、ルートノードaに遷移する。トライ木生成部250aは、入力キーの現在のポインタを8文字目(カンマを除く)の「a」に設定する(ステップS83a)。
実データ上において、トライ木生成部250aは、ステップS82bで比較した結果、各キーが一致し、かつ、次の階層の入力キーがあるので、現在のノードをポインタ配列42に接続する。また、トライ木生成部250aは、入力キーのポインタをテキスト表35の3行目7列目の「a」に接続する(ステップS83b)。
続いて、図72の説明に移行する。トライ木生成部250aは、ルートノードbからノードaに移行し、入力キーのポインタを9文字目(カンマを除く)の「a」に設定する。トライ木生成部250aは、「a」をキーとする子ノードがノードaに存在しないので、ノードaを参照する。トライ木生成部250aは、ノードaのタグキー「aa.aaa」と、入力キーの現在のポインタの文字「a」から5文字目「a」までの文字列「aa.aaa」比較する(ステップS84a)。
実データ上において、トライ木生成部250aは、現在のノードをポインタ配列43に接続する。トライ木生成部250aは、ポインタヒア列43の「TAG」に接続された「a」から次のカンマまでの文字列「aa.aaa」と、入力キーのポインタに接続された「a」から次のカンマまでの文字列「aa.aaa」を比較する(ステップS84b)。
続いて、図73の説明に移行する。トライ木生成部250aは、ステップS84aで比較した結果、各キーが一致し、かつ、次の階層の入力キーがある。トライ木生成部250aは、次の階層の入力キーがあるので、次の階層に遷移し、ルートノードcに遷移する。トライ木生成部250aは、入力キーの現在のポインタを15文字目(カンマを除く)の「/」に設定する(ステップS85a)。
実データ上において、トライ木生成部250aは、ステップS84で比較した結果、各キーが一致し、かつ、次の階層の入力キーがあるので、現在のノードをポインタ配列44に接続する。また、トライ木生成部250aは、入力キーのポインタをテキスト表35の3行目15列目の「/」に接続する(ステップS85b)。
続いて、図74の説明に移行する。トライ木生成部250aは、キー「/」にてルートノードcからノード/に遷移し、入力キーの現在のポインタを1文字ずらした「c」に設定する。トライ木生成部250aは、ノード/において、キー「c」を遷移先とする子ノードが存在しないので、ノード/を参照する。トライ木生成部250aは、ノード/のタグキー「e/」と、入力キーの現時のポインタの文字「c/」を比較する(ステップS86a)。
実データ上において、トライ木生成部250aは、現在のノードをポインタ配列45に接続する。トライ木生成部250aは、ポインタ配列45の「TAG」に接続された「e」から次の空までの文字列「e/」と、入力キーのポインタに接続された「c」から次の空までの文字列「c/」を比較する(ステップS86b)。
続いて、図75に移行する。トライ木生成部250aは、ステップS86aで比較した結果、タグキーの優先度が入力キーの優先度よりも大きいと判定する。したがって、トライ木生成部250aは、タグキー「e/」およびタグキーの値「1」と、入力キー「c/」および入力キーの値「3」を交換する。そして、トライ木生成部250aは、入力キーをキー「http://aaa.aaa/e/」とし、入力キーの16文字目(カンマを除く)の「e」にポインタを設定する(ステップS87a)。
実データ上において、トライ木生成部250aは、ステップS86bで比較した結果、タグキーの優先度が入力キーの優先度よりも大きいと判定する。したがって、トライ木生成部250aは、ポインタ配列45の「TAG」をテキスト表35の3行目16列目の「c」に接続する。トライ木生成部250aは、入力キーのポインタをテキスト表35の1行目18列目の「e」に接続する(ステップS87b)。
続いて、図76に移行する。トライ木生成部250aは、ノード/において、キー「e」とする子ノードが存在しないので、新しいノードeを生成し、生成したノードeをノード/に接続する。トライ木生成部250aは、ノードeにタグキー「/」を接続し、入力キーに対応する値「1」を接続する(ステップS88a)。
実データ上において、トライ木生成部250aは、ノードeに対応するポインタ配列46を生成し、ポインタ配列45のキー番号「0×65」で、ポインタ配列45とポインタ配列46を接続する。トライ木生成部250aは、ポインタ配列46の「TAG」を、テキスト表35の1行目18列目の「e」に接続する(ステップS88b)。
図56の説明に戻ると、トライ木探索部250bは、トライ木240bに登録された値の集計値を抽出する処理、所定のキーに対応する値をトライ木240bから検索する処理を実行する処理部である。
まず、トライ木探索部250bが、トライ木240bに登録された値の集計値を抽出する処理について説明する。トライ木探索部250bは、トライ木240bを順に辿り、ノードに登録された値を順次出力する。ノードに複数の値が登録されている場合には、トライ木探索部250bは、各値を合計しても良いし、別々に出力しても良い。
図77〜図89は、本実施例2にかかる集計値を抽出する処理を説明するための図である。図77に示すトライ木は、図60〜図76の説明において作成したトライ木とする。トライ木探索部250bは、ルートノードaの長男ノードとなるノードhに現在のノードを移行する(ステップS90a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列41に接続する(ステップS90b)。
図78に移行する。トライ木探索部250bは、次の階層に遷移し、現在のノードをルートノードbに移行する(ステップS91a)。実データ上において、トライ木探索部250aは、現在のノードをポインタ配列42に接続する(ステップS91b)。
図79に移行する。トライ木探索部250bは、ルートノードbの長男ノードとなるノードaに現在のノードを移行する(ステップS92a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列43に接続する(ステップS92b)。
図80に移行する。トライ木探索部250bは、次の階層に遷移し、現在のノードをルートノードcに移行する(ステップS93a)。実データ上において、トライ木探索部250aは、現在のノードをポインタ配列44に接続する(ステップS93b)。
図81に移行する。トライ木探索部250bは、ルートノードcの長男ノードとなるノード/に現在のノードを移行する。ノードhは値「3」を登録しているので、トライ木探索部250bは、キー「http://aaa.aaa/c/」と、値「3」を対応付けて出力する(ステップS94a)。
実データ上において、トライ木探索部250aは、現在のノードをポインタ配列45に接続する。ポインタ配列45は「Data」に「3」を格納しているので、トライ木探索部250bは、ポインタ配列45の「TAG」に接続された文字「c」の前後空までの文字列「http://aaa.aaa/c/」と、値「3」を対応付けて出力する(ステップS94b)。
図82に移行する。トライ木探索部250bは、ノード/の長男ノードとなるノードeに現在のノードを移行する。ノードeは値「1」を登録しているので、トライ木探索部250bは、キー「http://aaa.aaa/e/」と、値「1」を対応付けて出力する(ステップS95a)。
実データ上において、トライ木探索部250bは、現在のノードをポインタ配列46に接続する。ポインタ配列46は「Data」に「1」を格納しているので、トライ木探索部250bは、ポインタ配列46の「TAG」に接続された文字「e」の前後空までの文字列「http://aaa.aaa/e/」と、値「1」を対応付けて出力する(ステップS95b)。
図83に移行する。トライ木探索部250bは、ノード/の弟ノードとなるノードgに現在のノードを移行する。ノードgは値「2」を登録しているので、トライ木探索部250bは、キー「http://aaa.aaa/g/」と、値「2」を対応付けて出力する(ステップS96a)。
実データ上において、トライ木探索部250bは、現在のノードをポインタ配列47に接続する。ポインタ配列47は「Data」に「2」を格納しているので、トライ木探索部250bは、ポインタ配列47の「TAG」に接続された文字「/」の前後空までの文字列「http://aaa.aaa/g/」と、値「2」を対応付けて出力する(ステップS96b)。
図84に移行する。トライ木探索部250bは、ノード/にノードe、ノードg以外の子ノードが存在しないので、ノードgからノード/に現在のノードを移行する(ステップS97a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列45に接続する(ステップS97b)。
図85に移行する。トライ木探索部250bは、ルートノードcにノード/以外の子ノードが存在しないので、ノード/からルートノードcに現在のノードを移行する(ステップS98a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列44に接続する(ステップS98b)。
図86に移行する。トライ木探索部250bは、ルートノードcにおいて、前の階層が存在するので、前の階層に戻り、現在のノードをノードaに移行する(ステップS99a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列43に接続する(ステップS99b)。
図87に移行する。トライ木探索部250bは、ノードaに子ノード(ルートノードcを除く)と弟ノードが存在しないので、ルートノードbに現在のノードを移行する(ステップS100a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列42に接続する(ステップS100b)。
図88に移行する。トライ木探索部250bは、ルートノードbにおいて、前の階層が存在するので、前の階層に戻り、現在のノードをノードhに移行する(ステップS101a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列41に接続する(ステップS101b)。
図89に移行する。トライ木探索部250bは、ノードhに子ノード(ルートノードbを除く)と弟ノードが存在しないので、ルートノードaに現在のノードを移行する。ルートノードaにおいて、前の階層が存在しないので、トライ木探索部250bは、集計値を抽出する処理を終了する(ステップS102a)。実データ上において、トライ木探索部250bは、現在のノードをポインタ配列40に接続する。そして、トライ木探索部250bは、集計値を抽出する処理を終了する(ステップS102b)。
図77〜図89では、ルートノードから順にノードを辿って、ノードに登録された値を出力する場合について説明した。しかし、実施例1に示したように、所定のキーを指定し、指定したキーに基づいて集計値を抽出しても良い。
次に、トライ木探索部250bが、指定された入力キーに対応する値をトライ木240bから検索する処理について説明する。図90〜図98は、本実施例2にかかる検索処理を説明するための図である。図90〜図98に示すトライ木は、図60〜図76の説明において作成したトライ木とする。また、図90〜図98に示す説明では、入力キー「http://aaa.aaa/c/」が指定された場合の検索処理について説明する。
図90において、トライ木探索部250bは、入力キーのポインタを先頭文字「h」に設定し、現在のノードをルートノードaに設定する(ステップS110a)。実データ上において、トライ木探索部250bは、入力キー「http://aaa.aaa/c/」をテキスト表36に格納し、7文字毎にカンマで区切る。トライ木探索部250bは、テキスト表36の1列目の文字「h」に入力キーのポインタを接続する。トライ木探索部250bは、現在のノードをポインタ配列40に接続する(ステップS110b)。
図91に移行する。トライ木探索部250bは、入力キーのポインタの指定する「h」により、ルートノードaからノードhに遷移する。トライ木探索部250bは、入力キーのポインタを2文字目の「t」に設定する(ステップS111a)。
実データ上において、トライ木探索部250bは、現在のノードをポインタ配列41に接続する。トライ木探索部250bは、テキスト表36の2列目の文字「t」に入力キーのポインタを接続する(ステップS111b)。
図92に移行する。ノードhにおいて「t」をキーとする子ノードが存在しないので、トライ木探索部250bは、ノードhのタグキー「ttp://」と、入力キーのポインタから5文字目までの文字列「ttp://」を比較する。トライ木探索部250bは、タグキーと文字列が一致すると判定する(ステップS112a)。
実データ上において、トライ木探索部250bは、ポインタ配列41の「TAG」に接続された文字「t」から次のカンマまでの文字列「ttp://」と、入力キーのポインタに接続された文字「t」から次のカンマまでの文字列「ttp://」を比較する。トライ木探索部250bは、各文字列が一致すると判定する(ステップS112b)。
図93に移行する。トライ木探索部250bは、次の階層の入力キーと次の階層へのリンクが存在するので、次の階層に遷移し、現在のノードをルートノードbに設定する。トライ木探索部250bは、入力キーを9文字目(カンマを除く)の「a」に設定する(ステップS113a)。
実データ上において、トライ木探索部250bは、ポインタ配列41の「Next」に接続されたポインタ配列42に現在のノードのポインタを接続する。また、トライ木探索部250bは、入力キーのポインタをテキスト表36の9列目の「a」に設定する(ステップS113b)。
図94に移行する。トライ木探索部250bは、入力キーのポインタの指定する「a」により、ルートノードbからノードaに現在のノードを設定する。トライ木探索部250bは、入力キーを10文字目(カンマを除く)の「a」に設定する(ステップS114a)。
実データ上において、トライ木探索部250bは、現在のノードをポインタ配列43に接続する。トライ木探索部250bは、入力キーのポインタをテキスト表36の10列目の「a」に設定する(ステップS114b)。
図95に移行する。ノードaにおいて「a」をキーとする子ノードが存在しないので、トライ木探索部250bは、ノードaのタグキー「aa.aaa」と、入力キーのポインタから5文字目までの文字列「aa.aaa」を比較する。トライ木探索部250bは、タグキーと文字列が一致すると判定する(ステップS115a)。
実データ上において、トライ木探索部250bは、ポインタ配列43の「TAG」に接続された文字「a」から次のカンマまでの文字列「aa.aaa」と、入力キーのポインタに接続された文字「a」から次のカンマまでの文字列「aa.aaa」を比較する。トライ木探索部250bは、各文字列が一致すると判定する(ステップS115b)。
図96に移行する。トライ木探索部250bは、次の階層の入力キーと次の階層へのリンクが存在するので、次の階層に遷移し、現在ノードをルートノードcに設定する。トライ木探索部250bは、入力キーを17文字目(カンマを除く)の「/」に設定する(ステップS116a)。
実データ上において、トライ木探索部250bは、ポインタ配列43の「Next」に接続されたポインタ配列44に現在のノードのポインタを接続する。また、トライ木探索部250bは、入力キーのポインタをテキスト表36の17列目の「/」に設定する(ステップS116b)。
図97に移行する。トライ木探索部250bは、入力キーのポインタの指定する「/」により、ルートノードcからノード/に現在のノードを設定する。トライ木探索部250bは、入力キーを18文字目(カンマを除く)の「c」に設定する(ステップS117a)。
実データ上において、トライ木探索部250bは、現在のノードをポインタ配列45に接続する。トライ木探索部250bは、入力キーのポインタをテキスト表36の18列目の「c」に設定する(ステップS117b)。
図98に移行する。トライ木探索部250bは、ノード/において「c」をキーとする子ノードが存在しないので、トライ木探索部250bは、ノード/のタグキー「c/」と、入力キーのポインタから最後までの文字列「c/」を比較する。トライ木探索部250bは、タグキーと文字列が一致すると判定し、ノード/に登録された値「3」を検索結果として出力する(ステップS118a)。
実データ上において、トライ木探索部250bは、ポインタ配列45の「TAG」に接続された文字「c」から次の空までの文字列「c/」と、入力キーのポインタに接続された文字「c」から次の空までの文字列「c/」を比較する。トライ木探索部250bは、各文字列が一致すると判定し、ポインタ配列45の「Data」に格納された値「3」を検索結果として出力する(ステップS118b)。
次に、本実施例2にかかる検索装置200の各種の処理手順について説明する。まず、本実施例2にかかる検索装置200がトライ木240bを生成する処理について説明する。図99は、本実施例2にかかるトライ木生成処理の処理手順を示すフローチャートである。
図99に示すように、トライ木生成部250aは、ルートノードを生成し(ステップS500)、次の入力データ(キー、値)が登録データ管理テーブル240aに存在するか否かを判定する(ステップS501)。
トライ木生成部250aは、次の入力データが登録データ管理テーブル240aに存在しないと判定した場合には(ステップS502,No)、処理を終了する。一方、トライ木生成部250aは、次の入力データが登録データ管理テーブル240aに登録されている場合には(ステップS502,Yes)、未読の入力データを読み出し(ステップS503)、データ追加処理を実行する(ステップS504)。
ここで、図99のステップS504に示したデータ追加処理の処理手順について説明する。図100〜図102は、本実施例2にかかるデータ追加処理の処理手順を示すフローチャートである。
図100に示すように、トライ木生成部250aは、現在のノードをルートノードに設定し(ステップS510)、入力キーが空であるか否かを判定する(ステップS511)。トライ木生成部250aは、入力キーが空でない場合に(ステップS512,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS513)。
トライ木生成部250aは、子ノードが存在しない場合に(ステップS514,No)、ステップS516に移行する。一方、トライ木生成部250aは、子ノードが存在する場合に(ステップS514,Yes)、入力キーの先頭の1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードへ遷移し(ステップS515)、ステップS511に移行する。
ところで、ステップS512において、入力キーが空の場合には(ステップS512,Yes)、トライ木生成部250aは、ノードの情報を参照する(ステップS516)。トライ木生成部250aは、タグキーの優先度が入力キーの優先度と等しいか否かを判定し(ステップS517)、等しい場合には(ステップS518,Yes)、図101のステップS524に移行する。
トライ木生成部250aは、タグキーの優先度と入力キーの優先度が異なる場合に(ステップS518,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS519)。トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きくない場合に(ステップS520,No)、図102のステップS532に移行する。
一方、トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きい場合に(ステップS520,Yes)、兄ノードが存在する、または、親ノードがルートノードであるか否かを判定する(ステップS521)。
トライ木生成部250aは、兄ノードが存在しない、かつ、親ノードがルートノードではない場合(条件を満たさない場合)に(ステップS522,No)、入力キーのポインタを1文字戻し、親ノードへ遷移し(ステップS523)、ステップS516に遷移する。
一方、トライ木生成部250aは、兄ノードが存在する、または、親ノードがルートノードの場合(条件を満たす場合)に(ステップS522,Yes)、図102のステップS535に移行する。
図101に移行する。トライ木生成部250aは、次の階層の入力キーが存在するか否かを判定する(ステップS524)。トライ木生成部250aは、次の階層の入力キーが存在しない場合に(ステップS525,No)、現在のノードに入力値を追加し(ステップS526)、データ追加処理を終了する。
一方、トライ木生成部250aは、次の階層の入力キーが存在する場合に(ステップS525,Yes)、次の階層へのリンクが存在するか否かを判定する(ステップS527)。トライ木生成部250aは、次の階層へのリンクが存在する場合に(ステップS528,Yes)、次の階層へ遷移し、入力キーを次の階層の入力キーに設定し(ステップS529)、図100のステップS511に移行する。
トライ木生成部250aは、次の階層へのリンクが存在しない場合には(ステップS528,No)、新しいルートノードと新しいノードを生成する(ステップS530)。トライ木生成部250aは、次の階層へのリンクを新しいルートノードにし、現在のノードを新しいノードにし、入力キーを次の階層の入力キーにし(ステップS531)、図102のステップS537に移行する。
図102に移行する。トライ木生成部250aは、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS532)。トライ木生成部250aは、子ノードが存在する場合に(ステップS533,Yes)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードに遷移する(ステップS534)。
トライ木生成部250aは、現在のノードのタグキー、値と入力キー、入力値をそれぞれ交換し(ステップS535)、ステップS532に移行する。
ところで、ステップS533において、子ノードが存在しない場合に(ステップS533,No)、トライ木生成部250aは、新しいノードを生成する(ステップS536)。トライ木生成部250aは、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして、現在のノードから新しいノードへ接続する(ステップS537)。
トライ木生成部250aは、入力キーをタグキーとして新しいノードに追加し(ステップS538)、図101のステップS524に移行する。
次に、本実施例2にかかる検索装置200がトライ木から入力キーに対応した値を検索する処理について説明する。図103および図104は、本実施例2にかかる検索処理の処理手順を示すフローチャートである。
図103に示すように、トライ木探索部250bは、現在のノードをルートノードに設定し(ステップS550)、入力キーが空であるか否かを判定する(ステップS551)。トライ木探索部250bは、入力キーが空ではない場合に(ステップS552,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS553)。
トライ木探索部250bは、子ノードが存在しない場合に(ステップS554,No)、図104のステップS556に移行する。トライ木探索部250bは、子ノードが存在する場合に(ステップS554,Yes)、入力キーの先頭文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードへ遷移し(ステップS555)、ステップS551に移行する。
なお、ステップS552において、トライ木探索部250bは、入力キーが空の場合に(ステップS552,Yes)、図104のステップS556に移行する。
図104に移行する。トライ木探索部250bは、ノードの情報を参照し(ステップS556)、タグキーの優先度が入力キーの優先度と等しいか否かを判定する(ステップS557)。トライ木探索部250bは、タグキーの優先度と入力キーの優先度が等しい場合に(ステップS558,Yes)、次の階層の入力キーが存在するか否かを判定する(ステップS559)。
トライ木探索部250bは、次の階層の入力キーが存在しない場合に(ステップS560,No)、現在のノード(ノードに登録された値)を出力する(ステップS561)。一方、トライ木探索部250bは、次の階層の入力キーが存在する場合に(ステップS560,Yes)、次の階層へのリンクが存在するか否かを判定する(ステップS562)。
トライ木探索部250bは、次の階層へのリンクが存在しない場合に(ステップS563,No)、データが無い旨を出力する(ステップS564)。一方、トライ木探索部250bは、次の階層へのリンクが存在する場合に(ステップS563,Yes)、次の階層へ遷移し、入力キーを次の階層の入力キーに設定し(ステップS565)、図103のステップS551に移行する。
ところで、ステップS558において、トライ木探索部250bは、タグキーの優先度と入力キーの優先度が異なる場合に(ステップS558,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS566)。
トライ木探索部250bは、タグキーの優先度が入力キーの優先度よりも大きくない場合に(ステップS567,No)、データが無い旨を出力する(ステップS568)。一方、トライ木探索部250bは、タグキーの優先度が入力キーの優先度よりも大きい場合には(ステップS567,Yes)、兄ノードが存在する、または、親ノードがルートノードであるか否かを判定する(ステップS569)。
トライ木探索部250bは、兄ノードが存在する、または、親ノードがルートノードである場合(条件を満たす場合)に(ステップS570,Yes)、ステップS568に移行する。一方、トライ木探索部250bは、兄ノードが存在しない、かつ、親ノードがルートノードではない場合(条件を満たさない場合)に(ステップS570,No)、入力キーのポインタを1文字戻し、親ノードへ遷移し(ステップS571)、ステップS556に移行する。
次に、本実施例2にかかる検索装置200が、集計値などを出力する出力処理について説明する。図105は、本実施例2にかかる出力処理の処理手順を示すフローチャートである。図105に示すように、トライ木探索部250bは、現在のノードをルートノードに設定し(ステップS600)、次の階層が存在するか否かを判定する(ステップS601)。
トライ木探索部250bは、次の階層が存在する場合に(ステップS602,Yes)、次の階層へ遷移し(ステップS603)、ノードにデータが存在するか否かを判定する(ステップS604)。
トライ木探索部250bは、ノードにデータが存在しない場合に(ステップS605,No)、ステップS600に移行する。一方、トライ木探索部250bは、ノードにデータが存在する場合に(ステップS605,Yes)、現在のノードの各種データを加工(ノードに登録された各値を集計)し出力し(ステップS606)、ステップS600に移行する。
ところで、ステップS602において、トライ木探索部250bは、次の階層が存在しない場合に(ステップS602,No)、子ノードが存在するか否かを判定する(ステップS607)。トライ木探索部250bは、子ノードが存在する場合に(ステップS608,Yes)、長男ノードに遷移し(ステップS609)、ステップS604に移行する。
トライ木探索部250bは、子ノードが存在しない場合に(ステップS608,No)、弟ノードが存在するか否かを判定する(ステップS610)。トライ木探索部250bは、弟ノードが存在しない場合に(ステップS611,No)、次弟ノードへ遷移し(ステップS612)、ステップS604に移行する。
トライ木探索部250bは、弟ノードが存在する場合に(ステップS611,Yes)、親ノードへ遷移し(ステップS613)、現在のノードがルートノードであるか否かを判定する(ステップS614)。
トライ木探索部250bは、現在のノードがルートノードではない場合に(ステップS615,No)、ステップS610に移行する。一方、トライ木探索部250bは、現在のノードがルートノードの場合に(ステップS615,Yes)、1つ前に階層が存在するか否かを判定する(ステップS616)。
トライ木探索部250bは、1つ前に階層が存在しない場合に(ステップS617,No)、処理を終了する。一方、トライ木探索部250bは、1つ前に階層が存在する場合に(ステップS617,Yes)、1つ前の階層に戻り(ステップS618)、ステップS607に移行する。
次に、本実施例2にかかる検索装置200が、トライ木240bからデータを削除する削除処理について説明する。図106および図107は、本実施例2にかかる削除処理の処理手順を示すフローチャートである。
図106に示すように、トライ木生成部250aは、現在のノードをルートノードに設定し(ステップS650)、入力キーが空であるか否かを判定する(ステップS651)。トライ木生成部250aは、入力キーが空ではない場合に(ステップS652,No)、入力キーの先頭文字のキーで子ノードを参照し、子ノードが存在するか否かを判定する(ステップS653)。
トライ木生成部250aは、子ノードが存在する場合に(ステップS654,Yes)、入力キーの先頭1文字を読み取り、入力キーのポインタを1文字進め、読み出した文字をキーとして子ノードへ遷移し(ステップS655)、ステップS651に移行する。一方、トライ木生成部250aは、子ノードが存在しない場合に(ステップS654,No)、ステップS656に移行する。
ところで、ステップS652において、トライ木生成部250aは、入力キーが空の場合に(ステップS652,Yes)、ノードの情報を参照し(ステップS656)、タグキーの優先度が入力キーの優先度と等しいか否かを判定する(ステップS657)。
トライ木生成部250aは、タグキーの優先度と入力キーの優先度が等しい場合に(ステップS658,Yes)、次の階層の入力キーが存在するか否かを判定する(ステップS659)。トライ木生成部250aは、次の階層の入力キーが存在しない場合に(ステップS660,No)、図107のステップS670に移行する。
一方、トライ木生成部250aは、次の階層の入力キーが存在する場合に(ステップS660,Yes)、次の階層へのリンクが存在するか否かを判定する(ステップS661)。トライ木生成部250aは、次の階層へのリンクが存在しない場合に(ステップS662,No)、ステップS669に移行する。
トライ木生成部250aは、次の階層へのリンクが存在する場合に(ステップS662,Yes)、次の階層へ遷移し、入力キーを次の階層の入力キーに設定し(ステップS663)、ステップS651に移行する。
ところで、ステップS658において、トライ木生成部250aは、タグキーの優先度が入力キーの優先度と異なる場合に(ステップS658,No)、タグキーの優先度が入力キーの優先度よりも大きいか否かを判定する(ステップS664)。
トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きくない場合に(ステップS665,No)、ステップS669に移行する。一方、トライ木生成部250aは、タグキーの優先度が入力キーの優先度よりも大きい場合に(ステップS665,Yes)、兄ノードが存在する、または、親ノードがルートノードであるか否かを判定する(ステップS666)。
トライ木生成部250aは、兄ノードが存在しない、かつ、親ノードがルートノードではない場合(条件を満たさない場合)に(ステップS667,No)、入力キーのポインタを1文字戻し、親ノードへ遷移し(ステップS668)、ステップS651に移行する。
トライ木生成部250aは、兄ノードが存在する、または、親ノードがルートノードの場合(条件を満たす場合)に(ステップS667,Yes)、削除データが存在しない旨を出力する(ステップS669)。
図107に移行する。トライ木生成部250aは、削除対象データが存在するか否かを判定する。(ステップS670)トライ木生成部250aは、削除対象データが存在しない場合に(ステップS671,No)、削除対象が無い旨を出力する(ステップS672)。
トライ木生成部250aは、削除対象データが存在する場合に(ステップS671,Yes)、対象データを削除し(ステップS673)、他のデータが存在するか否かを判定する(ステップS674)。
トライ木生成部250aは、他のデータが存在する場合に(ステップS675,Yes)、処理を終了する。トライ木生成部250aは、他のデータが存在しない場合に(ステップS675,No)、現在のノードはルートノードであるか否かを判定する(ステップS676)。
トライ木生成部250aは、現在のノードがルートノードの場合に(ステップS677,Yes)、処理を終了する。トライ木生成部250aは、現在のノードがルートノードではない場合に(ステップS677,No)、子ノードが存在するか否かを判定する(ステップS678)。
トライ木生成部250aは、子ノードが存在する場合に(ステップS679,Yes)、現在のノードのデータを長男ノードのデータに設定し(ステップS680)、長男ノードへ遷移し(ステップS681)、ステップS678に移行する。トライ木生成部250aは、子ノードが存在しない場合に(ステップS679,No)、親ノードの現在のノードへのエッジを削除し、現在のノードを削除する(ステップS682)。
上述してきたように、本実施例2にかかる検索装置200は、固定長の文字列をタグキーとしてノードに接続し、固定長の文字列の配下(固定帳の文字列を有するノードの配下)に新たにルートノードを作成して、階層的なトライ木を生成する。したがって、検索装置200が、トライ木の再構築を実行する場合に、ノードに接続するタグキーおよび更新するタグキーを該当する階層内のみで実行すればよいので、再接続するタグキーの数、更新するタグキーの数を大幅に削減することが出来る。
ところで、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、CPUおよび当該CPUにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
図108は、実施例2に示した検索装置200(あるいは、実施例1にかかる検索装置100)に対応するコンピュータのハードウェア構成を示す図である。図108に示すように、このコンピュータ(検索装置)10は、入力装置11、モニタ12、RAM(Random Access Memory)13、ROM(Read Only Memory)14、ネットワークを介して他の装置とデータ通信を実行する通信制御装置15、媒体読取装置16、CPU(Central Processing Unit)17、HDD(Hard Disk Drive)18をバス19で接続している。
そして、HDD18には、上述した検索装置200の機能と同様の機能を発揮するトライ木生成プログラム18b、トライ木探索プログラム18cが記憶されている。CPU17が、トライ木生成プログラム18b、トライ木探索プログラム18cを読み出して実行することにより、トライ木生成プロセス17a、トライ木探索プロセス17bが起動される。
ここで、トライ木生成プロセス17aは、図56に示したトライ木生成部250aに対応する。また、トライ木探索プロセス17bは、図56に示したトライ木探索部250bに対応する。
なお、HDD18は、図56で示した記憶部240に記憶されたデータに対応する各種データ18aを記憶している。CPU17は、HDD18に記憶された各種データ18aをRAM13に読み出し、各種データ13aを利用して、トライ木の構築等を実行する。
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
所定の文字数を含む文字列に対応するノードが木構造にて接続されるトライ木を記憶装置に記憶し、当該トライ木に新規の文字列を登録する場合に、当該新規の文字列の文字を先頭から順に読み出して前記トライ木の各ノードを辿り、辿ったノードに対応する文字列と一致する文字列を新規の文字列から除いた後、ノードに新規の根ノードを接続し、接続した根ノードに新規のノードを追加すると共に、新規の文字列のうち、所定の文字数を含む文字列を新規のノードに登録する文字列登録機能
を実現させるためのプログラムを格納した記憶媒体。
(付記2)前記文字列登録機能は、各ノードに登録される各文字列に優先度を設定し、当該優先度に基づいて各ノードに各文字列を登録することを特徴とする付記1に記載の記憶媒体。
(付記3)前記文字列登録機能は、新規の文字列の文字を先頭から順に読み出して、前記トライ木のノードを辿り、辿ったノードのうち、兄ノードを有するノードの中で最下層に位置する特定ノードを判定する判定機能と、前記特定ノードから、前記新規の文字列の文字を順に読み出すことで最終的に到達するノードまでの経路に含まれるノードの何れか、または、葉ノードの配下に新規のノードを追加して、前記新規の文字列をノードに登録する登録機能を有することを特徴とする付記1または2に記載の記憶媒体。
(付記4)前記判定機能は、新規の文字列の文字を先頭から順に読み出して前記トライ木のノードを辿り、辿ったノードのうち、兄ノードを有するノードが存在しない場合には、最下層の根ノードに接続する子ノードを特定ノードとして判定することを特徴とする付記3に記載の記憶媒体。
(付記5)検索装置が、
所定の文字数を含む文字列に対応するノードが木構造にて接続されるトライ木を記憶装置に記憶するステップと、
当該トライ木に新規の文字列を登録する場合に、当該新規の文字列の文字を先頭から順に読み出して前記トライ木の各ノードを辿り、辿ったノードに対応する文字列と一致する文字列を新規の文字列から除いた後、ノードに新規の根ノードを接続し、接続した根ノードに新規のノードを追加すると共に、新規の文字列のうち、所定の文字数を含む文字列を新規のノードに登録するステップと
を含んだことを特徴とするトライ木生成方法。
(付記6)所定の文字数を含む文字列に対応するノードが木構造にて接続されるトライ木を記憶装置に記憶し、当該トライ木に新規の文字列を登録する場合に、当該新規の文字列の文字を先頭から順に読み出して前記トライ木の各ノードを辿り、辿ったノードに対応する文字列と一致する文字列を新規の文字列から除いた後、ノードに新規の根ノードを接続し、接続した根ノードに新規のノードを追加すると共に、新規の文字列のうち、所定の文字数を含む文字列を新規のノードに登録する文字列登録部
を有することを特徴とするトライ木生成装置。