题目三:英文拼写纠错:
在用户输入英文单词时,经常发生错误,我们需要对其进行纠错。假设已经有一个包
含了正确英文单词的词典,请你设计一个拼写纠错的程序。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度;
(3)请描述可能的改进(改进的方向如效果,性能等等,这是一个开放问题)
Answer1:
(1)思路 :
字典以字母键树组织,在用户输入同时匹配
(2)
流程:
每输入一个字母:
沿字典树向下一层,
a)若可以顺利下行,则继续至结束,给出结果;
b)若该处不能匹配,纠错处理,给出拼写建议,继续至a);
算法:
1.在字典中查找单词
字典采用27叉树组织,每个节点对应一个字母,查找就是一个字母
一个字母匹配.算法时间就是单词的长度k.
2.纠错算法
情况:当输入的最后一个字母不能匹配时就提示出错,简化出错处理,动态提示
可能 处理方法:
(a)当前字母前缺少了一个字母:搜索树上两层到当前的匹配作为建议;
(b)当前字母拼写错误:当前字母的键盘相邻作为提示;(只是简单的描述,可
以有更多的)
根据分析字典特征和用户单词已输入部分选择(a),(b)处理
复杂性分析:影响算法的效率主要是字典的实现与纠错处理
(a)字典的实现已有成熟的算法,改进不大,也不会成为瓶颈;
(b)纠错策略要简单有效 ,如前述情况,是线性复杂度;
(3)改进
策略选择最是重要,可以采用统计学习的方法改进。
题目四:寻找热门查询:
搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串
的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询串,要求使用的内存不能超过1G。
(1)请描述你解决这个问题的思路;
(2)请给出主要的处理流程,算法,以及算法的复杂度。
Answer1:
http://topic.youkuaiyun.com/t/20060414/22/4688140.html
最近时有公司出这种从几百万词条中找出频率最大的前几条或者重复的条目的问题。
对于这种问题实际上并不需要太多所谓的搜索专业知识,想想数据库是怎么实现或者数据结构中关于词典索引的章节就不难知道,这些题目的解决办法不外乎,采用二种数据结构:
树(二叉树,Trie树和B树)和哈希表。对于300万词条来说,构建一个开地址哈希肯定用不了1G内存,如果还不放心,就构建一棵Trie树,如果还怕内存不够就构建B+树进行多级索引。至于复杂度分析,稍微回忆一下你的数据结构书吧。
稍微补充一下,为啥要用B+树就是为了解决内存中不能载入全部数据的时候用来分级载入数据,这样可以充分利用内存的换入换出来解决海量数据操作的问题。这和操作系统的文件系统设计以及数据库实现原理是相似的。
Answer2:
http://bbs.yingjiesheng.com/thread-14496-1-5.html
(1)思路:用哈希做
(2) 首先逐次读入查询串,算哈希值,保存在内存数组中,同时统计频度(注意值与日志项对应关系)选出前十的频度,取出对应的日志串,简单不过了。哈希的设计是关键。
Answer3:
typedef struct
{
int id;
int count;
}hash[300w];
1000w大小为1000w*255B=2.5GB
300w*8=3M*8=24M
24M用于存储记录的出现次数,每一次读入0.9g,分3次读入。
每一次对查询串做hash值为v1,在对应的hash[v1].count++,hash[v1].id=I;
遍历一遍查询串就可以统计出出现次数最多的10个查询串了。
时间复杂度为O(n).