首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通配符拼字机

通配符拼字机
EN

Stack Overflow用户
提问于 2011-09-14 07:25:01
回答 3查看 4.4K关注 0票数 6

我遇到了一个问题,在我之前似乎也有过类似的问题,但是我还没有找到一个可行的解决方案。

我目前正在使用C#、MySQL、HTML5和Javascript构建一个移动web应用程序。该应用程序将用于帮助用户在玩拼字游戏时找到可能的单词。

我遇到的问题是:如何从包含字典的MySQL数据库中从用户字母输入中获得正确的单词?

更多细节:-用户可以输入任意数量的字母,也可以使用通配符(代表任何字母)。-如果用户输入“TEST”,结果不能包含大于1E和S的单词,以及超过2T的单词,那么使用“测试器”的结果将是不好的。-结果不能包含比输入更多字母的单词。

更新:正如Eric here所建议的那样,Trie是解决我的问题的方法。

问题是我是C#和MySQL的初学者,下面是一些后续问题:

  1. 如何从我的MySQL字典中创建Trie?(400k+ words )
  2. 如何存储Trie以便快速和将来访问?
  3. 如何访问Trie并使用C#从其中提取单词?

非常感谢您的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-14 07:32:08

如何从包含字典的MySQL数据库中从用户字母输入中获得正确的单词?

没有。关系数据库表并不是解决这个问题所需要的合适的数据结构。

相反,您要做的是从字典中构建一个数据结构(或者,如果您真的很喜欢的话,您可以构建一个 --一个有向无圈字图--这是一种压缩的trie)。

一旦您有一个trie/dawg,它变得非常便宜的测试,在字典中的每一个词在给定的货架,因为你可以“剪出”整个大分支的字典,架不可能匹配。

让我们看一个小例子。假设您有字典OP、OPS、OPT、OPTS、POT、POT、SOP、SOPS、STOP、STOP“,”您可以构建这个trie:(带有$的节点是标记为"word可以在这里结束“的节点。

代码语言:javascript
运行
AI代码解释
复制
           ^root^
           /  |  \
         O    P    S
         |    |   / \
         P$   O  O   T   
        / \   |  |   |
       T$  S$ T$ P$  O
       |      |  |   |
       S$     S$ S$  P$
                     |
                     S$

你有机架“老年退休金”--你是做什么的?

首先你说:“我能从O支部下来吗?”可以,停那儿吧。因此,现在的问题是将"PS“与O分支相匹配。你能沿着P支行走吗?是。它有字尾标记吗?是的,所以OP是匹配的。现在的问题是将"S“与OP分支匹配。你能沿着T支行走吗?不是的。你能沿着S支行走吗?是。现在,您有了空的机架,您必须将它与老年退休金分支相匹配。它有字尾标记吗?是!所以老年退休金也匹配。现在追溯到根部。

你能沿着P支行走吗?是。现在的问题是如何将OS与P分支相匹配。沿着PO分支,匹配S --失败了。回溯到根。

再说一遍,你看这是怎么回事。最后,我们沿着SOP分支,在SOP上找到了一个单词的结尾,所以"SOP“与这个支架相匹配。我们不去ST支行,因为我们没有T。

我们试过字典中的每一个可能的单词,发现OP、OPS和SOP都匹配。但我们从来不需要调查选择,盆栽,停止或停止,因为我们没有一个T。

你知道这种数据结构是如何使它非常高效的吗?一旦你确定你没有在架子上的字母来做一个单词的开头,你就不需要去调查任何从这个开始开始的字典单词。如果你有PO,但没有T,你就不必去调查陶片、土豆、钾肥、土豆或便宜货;所有那些昂贵而毫无结果的搜索都会很快消失。

调整系统以处理“野生”块是非常简单的;如果您有OPS?,那么只需运行26次搜索算法,在OPSA,OPSB,OPSC上.它应该足够快,这样做26次是便宜的(或26次,如果你有两个空白)。

这是专业拼字AI程序使用的基本算法,当然,它们也必须处理诸如板子位置、机架管理等问题,这使算法变得有些复杂。这个简单版本的算法将足够快,以生成所有可能的字架上。

当然,如果字典没有随时间变化,你只需要计算trie/dawg一次。从字典中构建trie可能很费时,所以您可能需要这样做一次,然后想出某种方法将trie存储在磁盘上,以便能够快速地从磁盘重新构建它。

您可以通过从trie中构建一个DAWG来优化内存使用。注意很多重复,因为在英语中,很多单词的结尾都是一样的,就像很多单词的开头一样。trie在一开始就很好地共享节点,但在最后共享节点却是一项糟糕的工作。例如,您可以注意到"S$ with子“模式非常常见,并将trie转换为:

代码语言:javascript
运行
AI代码解释
复制
           ^root^
          / |  \
        O   P    S
        |   |   / \
        P$  O  O   T   
       /  \ |  |   |
      T$  | T$ P$  O
      |    \ | |   |
       \    \| /   P$
        \    |/    |
         \   |    /
          \  |   /  
           \ |  /
            \| /  
             |/
             |       
             S$

节省了一整堆节点。然后您可能会注意到,两个单词现在以O$-S$结尾,两个单词以T$-S$结尾,所以您可以进一步压缩它:

代码语言:javascript
运行
AI代码解释
复制
           ^root^
           / | \
          O  P  S
          |  | / \
          P$ O \  T   
         /  \|  \ |
         |   |   \|
         |   |    O
         |   T$   |
          \  |    P$
           \ |   /
            \|  /  
             | /
             |/   
             S$

现在我们有了这本字典的最小道格。

进一步读:

http://dl.acm.org/citation.cfm?id=42420

http://archive.msdn.microsoft.com/dawg1

http://www.gtoal.com/wordgames/scrabble.html

票数 23
EN

Stack Overflow用户

发布于 2011-09-14 07:57:53

下面是我如何解决这个问题的方法(当然,假设您控制了DB,并且可以修改表/添加表,甚至可以控制DB的原始负载)。

我的解决方案是使用两个表,->,一个表将是字典中每一个可能的字母组合的列表,并按字母顺序排列组件字母。(即测试将是ESTT,测试人员将是ERSTT,DAD将添加)。

第二个表将包含每个单词,并引用表1的键。

表一- LetterInWord

代码语言:javascript
运行
AI代码解释
复制
Index Letters
1     ESTT
2     ESTTER
3     EST
4     ADD
5     APST

在表一中,您按字母顺序插入单词- test变成estt。

表二-字

代码语言:javascript
运行
AI代码解释
复制
Index LetterInWordIndex  Word
1     1                  TEST
2     2                  TESTER
3     3                  SET
4     4                  ADD
5     4                  DAD
6     5                  SPAT
7     5                  PAST               

在表2中插入带有适当单词和索引引用的单词。

这将是一个一对多的关系->表中的一个条目可能在Word表中有多个条目

非通配符查找:假设我的输入字母设置为字母排序。

然后在查找中,从LetterInWord中选择所有的“字母”,其中Letters = value并连接表单词--在一个查询中,您的输出是一个只包含这些字母的所有单词的列表。

现在对于通配符:假设我的输入字母是EST*请记住长度-4划出通配符-您得到了EST (确保按字母顺序排序)现在查找所有字母包含EST和字母长度<= 4的情况,这些字母连接在Word表上。

返回测试、休息、设置等

我不确定这是否是最有效的方法,但它有效。我过去曾使用它从字典中查找单词,它具有合理的性能和最小的复杂性。

票数 0
EN

Stack Overflow用户

发布于 2011-09-14 07:31:18

如果你只有字典的话,这将是非常困难的。如果您有能力创建一个新表或新列,我会:

创建一个包含单词列的表,再加上26列(每个字母一列),运行存储的proc/后端进程,计算单词中每个字母的出现情况,并将它们放入适当的列中。

然后(忽略通配符)你可以做到

从字典中选择单词,其中tcount <=2和ecount <=1和scount <=1

对于通配符,您可以这样做和长度<= number_of_letters

实际上,始终使用length子句,因为这样您就能够对其进行索引以提高性能。

在查询过程中,其他任何事情都将异常缓慢。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7418910

复制
相关文章
YouTube开源播放器中文使用指南
在这之前笔者使用原生的MediaPlayer、B站开源的IJKVideoView等播放器。直到发现ExoPlayer,这款由YouTube开发的播放器真的是非常强大。对于自定义播放器非常友好,里面将很多模块抽象成独立的组件可供使用者自行定制,当然官方也提供了一些默认的实现。如果你正在开发视频类功能,强烈推荐你尝试一下ExoPlayer。
吴延宝
2019/07/24
4K0
正确下载youtube视频的方式
youtube这个不存在的网站上有很多有用的资料,一般来说我们是可以下载所有视频到本地以供离线的情况下的研究学习,网上有很多工具提供了下载功能,但是在试用了很多标称很好用的软件后,老高发现,真的没有一个能和youtube-dl相提并论,所以老高还是记录一下如何使用正确使用youtube-dl!
老高的技术博客
2022/12/28
1.3K0
如何正确使用log
下面小编就为大家分享一篇使用log_format为Nginx服务器设置更详细的日志格式方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
习惯说一说
2019/07/04
2.4K0
[Java8]如何正确使用Optional
Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。这篇文章是建立在你对Optional的用法有一定了解的基础上的,如果你还不太了解Optional,可以先去看看相关教程,或者查阅Java文档。
KAAAsS
2022/01/14
7.1K0
Youtube开启或禁用HTML5播放器
用过MAC的TX都知道,如果没有FLASH想要播放YouTube的视频很麻烦。虽然用Chrome内置的FLASH很不错,但是动辄70+℃的CPU实在伤不起啊。H5播放器就没有这个弊端了,从此妈妈再也不用担心我的MAC了。
老高的技术博客
2022/12/27
1.4K0
iOS学习——iOS 宏(define)与常量(const)的正确使用
  在iOS开发中,经常用到宏定义,或用const修饰一些数据类型,经常有开发者不知怎么正确使用,导致项目中乱用宏与const修饰。你能区分下面的吗?知道什么时候用吗?
mukekeheart
2019/09/29
1.8K0
iOS学习——iOS 宏(define)与常量(const)的正确使用
如何正确的使用VSCode
由与我们的Coding工作比较辛苦,现在推荐大家一款VS code插件,专注于高(hun)效(shui)工(mo)作(yu),能让你更加高效的上(hua)班(shui)!
我被狗咬了
2019/09/23
4.7K0
如何正确的使用VSCode
如何“正确”使用技术词汇
大家知道,VESA 是视频电子标准协会的英文简称。它主导制定了一系列音视频领域的工业标准。最为大众熟知的标准之一就是 DisplayPort,还有目前在电视、显示器、手机屏得到广泛应用的 HDR 标准。
icsoc
2022/01/18
1.9K0
如何“正确”使用技术词汇
如何正确使用缓存技术
缓存技术是用来提升程序运行性能的常见手段,君不见, 阿里巴巴、新浪微博、美团网等互联网龙头企业都是用缓存技术来提升自己家网站的性能。然而,任何事物都有两面性, 缓存技术使用得当带来的好处自然不言而喻, 但是如果使用不当, 产生的副作用也够让人喝一壶的。 我们写服务器程序时,使用缓存的目的无非就是减少数据库访问次数降低数据库的压力和提升程序的响应时间, 然而根据具体的使用场景又可以派生出无数种情况, 比如说 程序频繁读取数据库, 但是查询获得的结果却总是相同的,这部分相同的结果是不是可以放入缓存 ? 获得查询
用户1608022
2018/04/11
2.2K0
如何正确的使用 order by
根据已有的知识,birth_city 字段出现在where条件中,我们在该字段上建立索引能加快访问速度。那么该语句的查询过程如下:
用户7447819
2021/07/23
2K0
iOS AVPlayer视频播放器
GOVVideoPlayer/GOVVideoController 是一个基于AVPlayer封装的视频播放器,支持播放/暂停、左右退拽快进、上下滑动调节音量、自动手动全屏、全屏时横屏Or竖屏、有缓冲进度指示条、卡顿指示器、切换视频源。 ---- 更新于2017/8/10,增加了GOVVideoController GOVVideoPlayer是在继承于UIView的基础上封装的视频View; GOVVideoController是在继承于UIViewController的基础上封装的视频视图控制器,
且行且珍惜_iOS
2018/05/22
4K0
如何正确合理使用 JavaScript async/await !
ES8 引入的 async/await 在 JavaScript 的异步编程中是一个极好的改进。它提供了使用同步样式代码异步访问 resoruces 的方式,而不会阻塞主线程。然而,它们也存在一些坑及问题。在本文中,将从不同的角度探讨 async/await,并演示如何正确有效地使用这对兄弟。
前端小智@大迁世界
2019/01/29
3.4K0
如何正确合理使用 JavaScript async/await !
如何正确使用padding和margin
前面两期我们学习了LinearLayout线性布局的方向、填充模型、权重和对齐,那么本期我们来学习LinearLayout线性布局的内边距和外边距。 关于padding和margin,很多同学傻傻分不清,相信通过今天的学习可以正确使用padding和margin。 一、内边距padding 默认情况下,组件相互之间是紧紧靠在一起的。但是有时候需要组件各边之间有一定的内边距,那就可以通过以下几个属性来设置,内边距的值是具体的尺寸,如5dp。 android:padding:为组件的四
分享达人秀
2018/02/02
4.1K0
如何正确使用padding和margin
干货!如何正确使用Git Flow
我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用。
哲洛不闹
2018/09/14
2.3K0
干货!如何正确使用Git Flow
如何正确使用图表颜色
前言 后台产品常常使用图表为用户直观呈现用户访问、机器性能等数据,辅助用户对数据进行分析,判断业务运行状况。在图表中必然少不了通过颜色来更加直观、有效地传递信息。但图表实际应用中,却存在颜色任意或者无意义地使用,造成噪音干扰。 那么,在图表中添加颜色时,如何正确地运用颜色来传递信息,帮助用户更好理解数据?本文将从以下几点进行陈述: 颜色传递特定信息 信息可视化原理 图表颜色应用 图表颜色使用建议 总结 颜色传递特定信息 在了解图表颜色该如何正确使用之前,先思考一个问题:在看图表中的颜色时,我们究竟能从中获取
腾讯云设计中心
2022/05/05
2.6K0
如何正确使用图表颜色
Python进阶——如何正确使用yield?
在 Python 开发中,yield 关键字的使用其实较为频繁,例如大集合的生成,简化代码结构、协程与并发都会用到它。
_Kaito
2021/03/23
2K0
安装LaTeX_如何正确使用
(很多杂志期刊接受LaTeX电子版时会提供自己的模板,只要使用他们的模板即可完美地展现在对应的刊物中)
全栈程序员站长
2022/09/21
2K0
安装LaTeX_如何正确使用
IOS下P2P播放器开发如何实现?
目前可以利用p2p技术,实现支持磁力链接、普通链接甚至是种子链接播放的软件,基本上还是集中在PC端。比如市场占有比较多的西瓜影音、吉吉影音、先锋影音,还有迅雷等。但是在手机端除了迅雷似乎没太有比较出名的P2P播放器。那么P2P技术在移动端的应用,从技术上来说是否可实现?包括安卓和iOS系统
点量小芹DolitQin520
2019/01/31
2.9K1
YouTube Direct:使用 YouTube 创建你自己的视频网站
YouTube 最近发布了一个新功能,YouTube Direct,它能让你i在自己的网站上直接嵌入 YouTube 视频上传功能,用户就能直接在第三方网站上上传视频,而 Direct 的用户则能够审核视频,是否接受用户上传的视频。这样 YouTube 除了是一个视频分享网站之外,现在又真正成为了一个视频服务存储服务平台,让任何媒体,组织或者个人都能利用 YouTube 构建属于自己的视频网站。
Denis
2023/04/14
1.9K0
YouTube Direct:使用 YouTube 创建你自己的视频网站
点击加载更多

相似问题

youtube-ios-播放器-助手和chromecast

210

Youtube iOS播放器助手库没有工作

11

我能为youtube-ios播放器助手静音吗?

36

IOS YouTube助手库

12

YTPlayerView youtube-ios-播放器-助手暂停不起作用

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档