タグ付けという考え方

以前はハッシュの本質は「分割して検索範囲を減らす」ことにあると思っていた。これはその通りであると思うが、別の見方をしてみると、「タグ付け」がハッシュ(というデータ構造)のアルゴリズムの本質であると思う。


タグ付けとは、すなわち、ある複数のオブジェクトがあったときに、1つ1つのオブジェクトにひもづけされたもう一つのデータを考えることである。ハッシュ(辞書)で言えば、オブジェクトValueがあったときに、Keyがタグである。そして、そのタグに対して、ソートしたりグループ化したりする。ハッシュの場合は、Keyにハッシュ関数を適用して出てきた値がダブった場合はグループ化して単に並べている。


この考え方はアルゴリズムの色々なところに応用されており、DSU(Decorate-Sort-Undecorate)もそうであるし、「珠玉のプログラミング」に載っていた以下の問題でもそうである。


「英語の辞書が与えられたときに、すべてのアナグラムを見つけよ」


これは、例えば、pans、pots、opt、snap、stop、topsという単語が与えられたら、まずタグをつける。つまり、

(anps pans)
(opst pots)
(opt  opt)
(anps snap)
(opst stop)
(opst tops)

というように、単語の文字列をソートした文字列でタグを付ける。次にタグをソートする。

(anps pans)
(anps snap)
(opt  opt)
(opst pots)
(opst stop)
(opst tops)

あとは、同じタグを順に取り出せばアナグラムが見つかるという訳である。タグ付けを応用したアルゴリズムはかなり便利である。今後は意識的に見てもう少し研究するつもり。