SQL anagram的效率和逻辑?

时间:2011-07-03 19:50:55

标签: sql performance logic

我有一个大约200,000个单词的SQL数据库。我需要一个查询,我将能够解决anagram类型。不同之处在于我需要输入字符可以使用的所有单词。例如,如果您输入 ofdg ,则应输出以下字词:执行执行。你能估算一下像这样的查询会花费多少时间。如何让它更快更有效?另外,一般来说,解析200000行数据库需要多长时间。

2 个答案:

答案 0 :(得分:4)

要解决这个问题,你需要做的第一件事就是将每个单词减少到Scrabble玩家称之为alphagram的内容。也就是说,单词中的所有字母都按字母顺序排列。因此dogodogdogodgo。当然,任何给定的alphagram可以对应于多个单词,因此,例如,alphagram dgo对应于单词doggod

您需要做的下一件事是使用键 alphagram-sequence number 和单个属性字段 word 构建一个表。

Word列表往往是静态的。例如,英语世界中的两个Scrabble单词列表每5年左右就会发生变化。所以你事先构造这个查找表。性能 O n ),这是沉没成本。也就是说,您只需执行一次并存储它,因此不会将其计入查询成本。您事先做到这一点。每次查询进入时,动态构建这样的索引绝对没有意义。

您可能想知道“拼字游戏的一切是什么?”答案是,在英语世界的两个已批准的锦标赛单词列表之间,你的20万字的数字整齐地下降。美国国家拼字游戏协会的官方锦标赛和俱乐部单词列表(2006)包含178,691个单词,由世界英语拼字游戏玩家协会维护的国际列表包含246,691个单词。

当你得到一个查询时,你将提供的单词减少为一堆alphagrams。输入odfg制作字母图od fo go df dg fg dfo dgo {{ 1}} fgo dfg(这在纯SQL中是一个很好的编程问题,所以我必须假设有一个PHP或Python或JavaScript前端会为你做这个)。然后在数据库中进行查找。每个查询的成本应该大约是 O (log2 n ),换句话说,非常直接。这种查询是关系数据库擅长的。

顺便说一句,你的示例输出很差。具有Scrabble玩家称为“构建”(所有可能的子集)的Alphagram dfgo使得dfgo do od of go dog god

(我讨厌必须这样做,但孩之宝的律师很敏感,所以: Scrabble是Hasbro公司在美国拥有的注册商标; Hasbro Canada Corporation在加拿大拥有;以及其他美泰公司JW Spear& Sons的世界。

答案 1 :(得分:0)

嗯,长度为n的单词中可能的字母组合数为n!。显然你还有一些选项,因为你想要更短的单词,但这并没有改变那么多的O(n!)关系。因此,尝试所有组合并在数据库中查找的简单算法将具有复杂性。

使算法更有效显然是为了减少搜索空间 - 有几个选项。

查找200.000行表需要多长时间取决于那里存储的数据类型,格式以及该表上的索引。