さて、変なことを提案しますが、私は長い間C++
使用しており、ライブラリBoost
を見に来ました。MultiIndex
このライブラリのアイデアは、1 つのコレクションを作成することですが、それを照会するさまざまな方法があります。実際、データベースをモデル化できます。
それでは、単語をテーブルに入れ、必要なインデックスを配置しましょう。
word |length|c0|c1|c2| ... |c26|
-------------------------|------|--|--|--| ... |---|
Singapour |9 |S |i |n | ... |0 |
クエリは次のようになります。
Select word From table Where length=9 And c2='n' And c8='u';
簡単ですね。
最大限の効率を得るには、テーブルを長さでパーティション分割し、インデックス (cX 列ごとに 1 つ) をパーティションに対してローカルにする必要があります。
インメモリ ソリューションの場合、長さごとに 1 つのコンテナーがあり、長さと同じ数のインデックスが含まれます。各インデックスは、並べ替えられたリストを指すハッシュ テーブルです (マージが容易になります)。
python の説明は次のとおりです。
class Dictionary:
def __init__(self, length):
self.length = length
self.words = set([])
self.indexes = collections.defaultdict(set)
def add(self, word):
if len(word) != self.length:
raise RuntimeException(word + ' is not ' + `self.length` + ' characters long')
if word in self.words:
raise RuntimeException(word + ' is already in the dictionary')
self.words.add(word)
for i in range(0,length):
self.indexes[(i,word[i])].add(word)
def search(self, list):
"""list: list of tuples (position,character)
"""
def compare(lhs,rhs): return cmp(len(lhs),len(rhs))
sets = [self.indexes[elem] for elem in list]
sets.sort(compare)
return reduce(intersection, sets)
length
ハッシュのサイズを最小限に抑えて検索を改善するために、私は自発的に引数を提供しました。また、セットは長さでソートされているため、交差の計算が改善されます:)
必要に応じて、他のソリューションと比較してテストしてください:)