我有一个大约200,000个单词的SQL数据库。我需要一个查询,我将能够解决anagram类型。不同之处在于我需要输入字符可以使用的所有单词。例如,如果您输入 ofdg ,则应输出以下字词:执行,执行和狗。你能估算一下像这样的查询会花费多少时间。如何让它更快更有效?另外,一般来说,解析200000行数据库需要多长时间。
答案 0 :(得分:4)
要解决这个问题,你需要做的第一件事就是将每个单词减少到Scrabble玩家称之为alphagram的内容。也就是说,单词中的所有字母都按字母顺序排列。因此do
,go
和dog
会do
,go
和dgo
。当然,任何给定的alphagram可以对应于多个单词,因此,例如,alphagram dgo
对应于单词dog
和god
。
您需要做的下一件事是使用键 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 ),换句话说,非常直接。这种查询是关系数据库擅长的。
dfgo
使得dfgo
do
od
of
go
dog
god
。
(我讨厌必须这样做,但孩之宝的律师很敏感,所以: Scrabble是Hasbro公司在美国拥有的注册商标; Hasbro Canada Corporation在加拿大拥有;以及其他美泰公司JW Spear& Sons的世界。)
答案 1 :(得分:0)
嗯,长度为n
的单词中可能的字母组合数为n!
。显然你还有一些选项,因为你想要更短的单词,但这并没有改变那么多的O(n!)
关系。因此,尝试所有组合并在数据库中查找的简单算法将具有复杂性。
使算法更有效显然是为了减少搜索空间 - 有几个选项。
查找200.000行表需要多长时间取决于那里存储的数据类型,格式以及该表上的索引。