查询词提升是现代搜索引擎中广泛使用的一种技术,当用户输入查询词前缀时,会给出一系列相关的查询词推荐,例如在搜索框内输入"中国",会提升"中国好声音","中国银行", "中国联通"等,尝试设计一个查询词提示系统,回答以下问题:
1.给定一个查询词集合,用何种数据结构和算法来构建最基本的提示系统?要求输入中文和拼音都能正常工作
2.用户输入的前缀下可能有很多可提示的查询词,如何对这些查询词进行排序,将用户选择概率更高的词放在前面?
1、答:可以使用trie树来构建最基本的提示系统,Trie树即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
当用户输入前缀的时候,搜索框会展示以i为前缀的trie树上的所有单词。对于中文,建立索引和查询前先转换成相应的拼音,查询完成后还得把拼音转换成汉字显示,且需要考虑数字和特殊字符。
2、答:可以使用topK算法,用于统计热词问题,解决热词问题可以使用hashmap+堆排序。hashmap统计:先对这批海量数据预处理。具体方法是:维护一个Key为Query字串,Value为该Query出现次数的HashTable,即hash_map(Query,Value),每次读取一个Query,如果该字串不在Table中,那么假如该字串,并且将Value值设为1;如果该字串在Table中,那么将该字串计数家一即可,最终用O(N)的时间复杂度内用Hash表完成了统计。
堆排序:借助堆这个数据结构,找出TopK,即借助堆结构,我们可以在log量级的时间内查找和调整/移动。因此,维护一个K大小的小根堆,然后遍历Query,分别和根元素进行对比。