我有一个很大的数据库来解决填字游戏,由单词和描述组成。我的应用程序允许搜索特定长度的单词和特定位置的字符(这很难完成……遍历所有单词并检查每个单词)。加上描述搜索(如有必要)
例如找到单词_ _ A _ _ B(6个字母的单词,第三个字符A和最后一个B)
我想以这样的方式为单词建立索引,以使搜索真正快速。我的第一个想法是使用平衡的树结构,还有其他建议吗?
好的,我要提出一些怪异的东西,但是C++由于使用Boost了很长时间,所以我来看看MultiIndex图书馆。
C++
Boost
MultiIndex
该库的想法是创建一个集合,但是有许多不同的查询方法。实际上,它可以为数据库建模。
因此,让我们将单词放在一个表中,并放置必要的索引:
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列一个)应位于分区本地。
对于内存中解决方案,每个长度有一个容器,其中包含与长度一样多的索引,每个索引都是一个指向排序列表的哈希表(更容易合并)
这是一个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论据,以最大程度地减少散列的大小,从而使搜索更好。此外,集合按长度排序,以便更好地计算交集:)
length
如果愿意,请继续对其他解决方案进行测试:)