有没有更好的方法来使用SQL查找字谜?

时间:2010-10-21 20:41:03

标签: sql

给出以下数据库表:

WORDS
 alphagram....varchar(15)
 word.........varchar(15) PK
 length.......int

其中:

  • 'alphagram'是按字母顺序排列的单词的字母(例如,AEINNRTT是INTRANET的alphagram)
  • 主键是'word',alphagram和length上有索引

我找到了一种通过SQL查找给定字母串的字谜的方法。例如,要找到AEINNRTT的字谜,这将起作用:

select alphagram, word, definition
from words
where length = 8
and alphagram like '%A%' 
and alphagram like '%E%' 
and alphagram like '%I%'
and alphagram like '%NN%' 
and alphagram like '%R%' 
and alphagram like '%TT%'

那将返回1行(对于INTRANET)

如果我想要包含已知数量的通配符,例如,INTRANET有多少单词+空白(通配符)我只需要将'长度'更改为字母总数+通配符数量

e.g。

select alphagram, word, definition
from words
where length = 9
and alphagram like '%A%' 
and alphagram like '%E%' 
and alphagram like '%I%'
and alphagram like '%NN%' 
and alphagram like '%R%' 
and alphagram like '%TT%'

...将返回8行(ENTERTAIN,INSTANTER,INTEGRANT,INTRANETS,ITINERANT,NATTERING,RATTENING和TRANSIENT)

我的问题是:是否有更有效的方法只通过SQL执行此操作?

这在SQLServer中运行得非常快,但在SqlLite中却相当慢。我意识到%xxx%的搜索速度并不快。

4 个答案:

答案 0 :(得分:2)

您可以为每个条目创建一种索引列,该字母按字母顺序包含该单词的所有字母,然后进行比较。每个anagram将具有相同的索引值。

答案 1 :(得分:0)

一个想法是这样做(对于给定的字长):

  • 将单词分成单个字符(可能在循环中使用SUBSTRING(),但更好的方法可能值得单独定向的SO问题)

  • generate all permutations

  • PROFIT!

尽管如此,作为一名评论者说,我强烈建议你在SQL之外做这件事,除非你有充分的理由不这样做或者你只是这样做来挑战你的技能。

答案 2 :(得分:0)

我想出这样做的最好方法是: 我创建了一个列... z 并解析每个单词并计算给定字母的出现次数并将其放在相应的列下 接下来,当我输入要解读的单词时,我计算了该单词的每个字母的每次出现,并将其与数据库中的单词进行比较 如果您需要进一步澄清,这可能有点难以理解,请告诉我

答案 3 :(得分:0)

这个问题已经过时了,我可能会误解某些内容,但似乎您的第一个请求可能是

select alphagram, word, definition
from words
where length = 8
and alphagram = 'AEINNRTT' and word <> alphagram

这是有效的,因为所有相同长度的字谜具有相同的alphagram。它将使用alphagram上的索引并且非常快。

长度&gt; 8个案例,有一个简单的场景更难,但我会尝试在表中添加26列:alpha_a,alpha_b,..包含alphagram中每个字母的数量。每个都可以有一个索引,然后你搜索

select alphagram, word, definition
from words
where length = 9
and alpha_a >= 1
and alpha_e >= 1
and alpha_i >= 1
and alpha_n >= 2
and alpha_r >= 1
and alpha_t >= 2