sse4.2 的字符串操作指令
前段时间实现了基于 Succinct Data Structure 的自动机,这种自动机(内存)存储方式将状态转移的 label 单独存储起来,从而,查找 label 就是一个在 byte 数组中查找 byte 的操作,并且,绝大多数情况下,需要查找的这个 byte 数组都非常短(状态的平均转移(label)数一般情况下大约是 2 )。 继续阅读
当搜索词中有错别字时,搜索引擎会尝试纠错通过相似拼音纠错搜索引擎把这些字还原成拼音,用一个拼音相同的已知的搜索词代替。 这是一种众所周知的纠错策略,但是,当输错的字是多音字,特别是有多个这样的错误输入时,所有的搜索引擎都尽量绕开这个问题,或者仅使用最常用的那些音去纠错。 因为要考虑所有可能的拼音组合,在极端情况下会导致指数爆炸! 例如某互联网大厂的实现(枚举多音字全排列)。 基于自动机的算法可以完美解决这个指数爆炸问题
这个算法也可以用来解决用户输入预测(智能提示)功能用户只输入Query开头部分,就自动提示出整个Query,例如用户输入举头望,就提示出举头望明月。就像现在各种搜索引擎做的那样。 基于编辑距离的纠错在已知的搜索词中寻找编辑距离与用户 Query 最小的词,使用我的算法也可以高效解决(还没做演示页面) |
前段时间实现了基于 Succinct Data Structure 的自动机,这种自动机(内存)存储方式将状态转移的 label 单独存储起来,从而,查找 label 就是一个在 byte 数组中查找 byte 的操作,并且,绝大多数情况下,需要查找的这个 byte 数组都非常短(状态的平均转移(label)数一般情况下大约是 2 )。 继续阅读
为了保证输入效率,我们需要有一个从 词条拼音 到 词条汉字 的映射表,比如,拼音序列 ZiDongJi 对应的词条是 自动机 , 自冻鸡 ;从而,逻辑上讲,这是一个 map<string,list<string> >。 继续阅读
也就是 C++ 函数名字的两阶段查找,模板实例化之前和实例化之后。
C++每个类对象都有一个名字空间,而非类对象,比如 int, char, long, char*….,没有关联的名字空间。 继续阅读
http://tech.meituan.com/pinyin-suggest.html
对比我们的纠错算法,美团的这个算法正好是一个反面教材,它集中展现了互联网时代糙快猛的核心价值观,以下是它的原文备份:
搜索关键字智能提示是一个搜索应用的标配,主要作用是避免用户输入错误的搜索词,并将用户引导到相应的关键词上,以提升用户搜索体验。 继续阅读
前一段时间,在将 多正则表达式匹配工具 用于数十万任意的正则表达式时,以前一直担心的问题终于出现了:NFA 转化 DFA 时的指数爆炸,那样的 DFA 根本创建不出来,因为那些正则表达式之间有不可预料的各种交集! 继续阅读
最近做了一项工作:允许一个 DFA 有多个起始状态(可以称作根: root)。引入这个概念有很多好处,主要体现在 DFA Union 中,这个操作通过 NFA 到 DFA 的转化来完成,算法思想很简单: 继续阅读
昨天一个朋友 checkout 了我的 febird 代码,编译时出现了一个诡异的错误。经过仔细勘察,他的 g++ 版本是 4.7.3,而我测试过的 g++4.7.2,g++4.8.2均无问题。 继续阅读