本网站仅单台服务器: 2核2G 99¥包年,集成兼容 MySQL 的 MyTopling 高压缩高性能数据库 |
|
本网站仅单台服务器: MyTopling 2核2G 99¥包年当搜索词中有错别字时,搜索引擎会尝试纠错通过相似拼音纠错搜索引擎把这些字还原成拼音,用一个拼音相同的已知的搜索词代替。 这是一种众所周知的纠错策略,但是,当输错的字是多音字,特别是有多个这样的错误输入时,所有的搜索引擎都尽量绕开这个问题,或者仅使用最常用的那些音去纠错。 因为要考虑所有可能的拼音组合,在极端情况下会导致指数爆炸! 例如某互联网大厂的实现(枚举多音字全排列)。 基于自动机的算法可以完美解决这个指数爆炸问题
这个算法也可以用来解决用户输入预测(智能提示)功能用户只输入Query开头部分,就自动提示出整个Query,例如用户输入举头望,就提示出举头望明月。就像现在各种搜索引擎做的那样。 基于编辑距离的纠错在已知的搜索词中寻找编辑距离与用户 Query 最小的词,使用我的算法也可以高效解决(还没做演示页面) 创建 DFA Key 与 搜索 DFA Key 的 耗时 包含了 收集网页展示需要的信息,耗时占比90%以上! |
先强调一点,在我的引擎中,所有正则表达式的语法结构,包括 并、交、差、补 都是在编译时完成的,对匹配性能无任何影响,切记!…… 现在可以开始了:
正则表达式,描述的是正则语言, 学过形式语言与自动机理论的人应该都知道,正则语言在并、交、差、补运算下都是封闭的;但是,根据 Wikipedia 的描述,到目前为止,还没有任何一个已知的正则流派(Flavor)将交和差纳入正则语法。理论与实践之间竟然隔着这么巨大的鸿沟!
并: | A || B | 能匹配 A 或者能匹配 B | 这三种操作都可以编译为 DFA, 从而非常高效地执行匹配 |
---|---|---|---|
交: | A && B | 能匹配 A 并且能匹配 B | |
差: | A &! B | 能匹配 A 但不能匹配 B,即从 A 中排除 B |
nark C++ 序列化库 尽管 性能优异,但是C++14以前,在某些情况下想要完全发挥性能优势,需要额外声明 DATA_IO_DUMP_RAW_MEM。
只是因为受制于 C++ 的语法限制,无法实现自动推导所有的 Dumpable 对象——可以 memcpy 的对象: 继续阅读
在使用 C++14 的新特性改进 febird dataio 序列化库时(参见: febird 序列化与 C++14 的新特性),发现了一个 gcc 的 bug,可以抽象出精简代码如下: 继续阅读
实现一个 C++ 容器时,都要提供 iterator, const_iterator, 一般情况下 iterator 和 const_iterator 几乎完全一样,不一样的地方仅在于: 继续阅读
任意两个字符串 s, t,如果能找到一种替换方式,对 t 中的每个字符 a ,用 s 中的一个字符 b 替换,最后得到一个字符串 t’,如果 t’ 与 s 相同,用符号计作 s->t;如果 s->t 且 t->s,我们称 s 与 t 等价。
例如,下面 4 个字符串就是(互相)等价的: 继续阅读
一直以来,自动机的创建程序(adfa_build/dawg_build/kvbin_build 等)性能虽然尚可,以最常用的 adfa_build 来说,根据不同的输入文本,平均吞度量能达到每秒钟 5~20M 。这个速度看上去还不错,至少比竞品要快了许多,但是,如果有非常大的数据 继续阅读
简单,优美,的代码,你能看出来哪些是二叉树的后序、前序、中序遍历吗?你还知道二叉树有什么遍历方法? 继续阅读