2010-10-21 65 views
5

考慮下面的數據庫表:有沒有更好的方法來使用SQL查找anagrams?

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

其中:

  • 'alphagram' 是按字母順序排列一個詞的字母(如AEINNRTT是INTRANET的alphagram)
  • 主鍵是'字',並且有字母和長度上的索引

我找到了一種方法來查找給定字符串的字母通過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 +空白(通配符)我只需要改變'長度'字母總數+通配符數

eg

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行(娛樂,INSTANTER,整合體,內聯網,流動,嘮叨,RATTENING和瞬態)

我的問題是:是否有這樣做的更有效的方法僅通過SQL?

這在SQLServer中運行得非常快,但在SqlLite中非常慢。我意識到%xxx%的搜索速度並不快。

+0

是否有一個原因,你只使用SQL而不是應用程序層? – JNK 2010-10-21 20:49:07

+0

我試圖讓事情變得簡單,但我很可能必須這樣做。 – eponymous23 2010-10-21 20:52:12

回答

0

一個想法是做這樣的(對於給定字長):

  • 分裂字爲單個字符(可能在循環中使用SUBSTRING(),但更好的方法可能是值得單獨有針對性的SO問題)

  • generate all permutations

  • 利潤!

雖然,作爲一個評論者說,我強烈建議你這樣做,外面SQL,除非你有很好的理由不要或者你只是這樣做是爲了挑戰你的技能。

2

您可以爲每個條目創建一種索引列,按照字母順序包含單詞的所有字母,然後比較這些條目。每個anagram將具有相同的索引值。

0

我想通過這樣做的最佳方式是: 我創建了列...並分析每個單詞並計算給定字母的出現次數,並且當我輸入要解讀的單詞時,將其放在相應的列 下面,我計算每個字母的每次出現,並將其與單詞中的單詞相比較數據庫 這可能是一個有點難以理解,讓我知道,如果你需要進一步澄清

0

這個問題是舊的,我可能誤解的東西,但似乎你的第一個請求可能是

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

這工作,因爲所有相同長度的字母都具有相同的字母數字。它會使用alphagram上的索引並且速度非常快。

對於長度> 8的情況,很難有一個簡單的方案,但我會嘗試在表中添加26列:alpha_a,alpha_b,..包含字母表中每個字母的數量。每個都可以有一個索引,然後你搜索

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 
相關問題