【问题标题】:SQL anagram efficiency and logic? [closed]SQL anagram 效率和逻辑? [关闭]
【发布时间】:2011-07-03 19:50:55
【问题描述】:

我有一个大约 200,000 个单词的 SQL 数据库。我需要一个能够解决字谜的查询。不同之处在于我需要所有可以用输入字符组成的单词。例如,如果您输入 ofdg,它应该输出以下单词:dogodog。你能估计一下这样的查询需要花费的时间吗?我怎样才能让它更快更高效?还有,一般SQL解析一个200000行的数据库需要多长时间。

【问题讨论】:

  • 您的架构是什么样的?你试过什么?这对我来说就像是家庭作业。

标签: sql performance logic


【解决方案1】:

要解决这个问题,您需要做的第一件事是将每个单词简化为拼字游戏玩家所说的字母表。也就是说,单词中的所有字母,但按字母顺序排列。所以dogodog 生成dogodgo。当然,任何给定的字母表可能对应多个单词,因此,例如,字母表dgo 对应于单词doggod

接下来你需要做的是用一个键字母序号和一个单一的属性字段word构建一个表。

单词列表往往是静态的。例如,英语世界中的两个 Scrabble 单词列表大约每 5 年更改一次。所以你事先构建了这个查找表。性能是 O( n ),它是沉没成本。也就是说,您执行一次并存储它,因此它不计入查询成本。您必须事先这样做。每次有查询进入时动态构建这样的索引是绝对没有意义的。

您可能想知道“Scrabble 的全部内容是什么?”答案是,你的 200,000 字的数字恰好落在英语世界两个批准的锦标赛单词列表之间。美国国家拼字游戏协会的官方锦标赛和俱乐部词汇表(2006 年)包含 178,691 个单词,由世界英语拼字游戏玩家协会维护的国际列表包含 246,691 个单词。

当您收到查询时,您会将提供的单词缩减为一堆字母表。输入odfg使得alphagrams od 987654332 go 987654334 dg 987654336 dfo 987654338 fgo 987654340 dfgo(它是纯粹的SQL一个漂亮的规划问题,所以我必须假设有一个 PHP 或 Python 或 JavaScript 前端可以为你做这件事)。然后你在数据库中进行查找。每个查询的成本应该约为 O(log2 n),换句话说,该死的直接。这种查询是关系型数据库擅长的。

顺便说一句,您的示例输出很差。 Alphagram dfgo 与拼字游戏玩家所谓的“构建”(所有可能的子集)使得 do od of go go dog god fog

(我讨厌不得不这样做,但孩之宝的律师很敏感,所以:Scrabble 是孩之宝公司在美国拥有的注册商标;在加拿大由孩之宝加拿大公司拥有;以及其余所有JW Spear & Sons,一家美泰公司。)

【讨论】:

  • 这是一个很棒的解释 Boar Gules 我真的很感谢我从未得到过如此深入的答案的帮助,非常感谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多