设计一个查询词提示系统

查询词提升是现代搜索引擎中广泛使用的一种技术,当用户输入查询词前缀时,会给出一系列相关的查询词推荐,例如在搜索框内输入"中国",会提升"中国好声音","中国银行", "中国联通"等,尝试设计一个查询词提示系统,回答以下问题:

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,分别和根元素进行对比。

时间: 2024-10-12 05:34:34

设计一个查询词提示系统的相关文章

从研发人的角度评判怎样设计一个好的DCS系统

相信从事自动化或控制系统的同仁,应该了解Distributed Control System(简称DCS)的基本功能及其在工控行业的作用.从工程应用的角度,一个完整的DCS系统主要包括三个部分:HMI人机交互层.控制站层.仪表与执行机构层. HMI主要包括工程师站.监控站.历史站等,主要在具有较高稳定的PC上安装相应的软件构成.控制站层,主要实现相应的控制算法与逻辑,并通过相应的IO卡件采集数据和发送指令.仪表与执行机构,主要由各个厂家的智能变送器.电动机等组成. 由于仪表与执行机构,厂家众多,

如何设计一个可伸缩的计数系统

很多应用程序都有通知或系统消息的功能模块,如果有新消息会以红点或消息条数在某个显眼位置展示给用户,这是计数系统使用场景之一.应用内部,比如微博,每个用户有自己发送微博数量,微博评价数等需要计数的需求,这也是计数系统常见的使用场景.将普遍需要的计数功能独立出一个单独的模块或系统,有利用系统的扩展,所以本文将讨论下如何构建一个可伸缩的计数系统. 1. 先对上述计数常见使用场景简要分析.第一种情况,如果有新消息,应用会显示消息条数或直接显示红点,比如CSDN通知栏的做法,这种场景需要的是消息的增量信息

航班信息查询和检索系统-数据结构课程设计

问题及代码: 设计并实现一个航班信息查询和检索系统.要求:对飞机航班信息进行排序和查找,可按照航班号.起点站.到达站.起飞时间和到达时间等信息进行查询.航班信息表的样式如下: 航班号 起点站 终点站 班期 起飞时间 到达时间 机型 票价 CA1544 合肥 北京 1.2.4.5 10:55 12:40 733 960 MU5341 上海 广州 每日 14:20 16:15 M90 1280 CZ3869 重庆 深圳 2.4.6 08:55 10:35 733 1010 其中航班号一项的格式为:前

Linux内核设计第三周——构造一个简单的Linux系统

Linux内核设计第三周 ——构造一个简单的Linux系统 一.知识点总结 计算机三个法宝: 存储程序计算机 函数调用堆栈 中断 操作系统两把宝剑: 中断上下文的切换 进程上下文的切换 linux内核源代码分析 arch/目录保存支持多种CPU类型的源代码 其中的关键目录包括:Documentation.drivers.firewall.fs(文件系统).include init目录:含有main.c,内核启动相关的代码基本都在init目录下 start_kernal()函数为启动函数,初始化内

如何设计一个RPC系统

版权声明:本文由韩伟原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/162 来源:腾云阁 https://www.qcloud.com/community RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型.使用习惯的约束,有大量的妥协和取舍之处.本文就是通过分析几种流行的RPC实现案例,提供

如何设计一个 RPC 系统

本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型.使用习惯的约束,有大量的妥协和取舍之处.本文就是通过分析几种流行的RPC实现案例,提供大家在设计RPC系统时的参考. 由于RPC底层的网络开发一般和具体使用环境有关,而编程实现手段也非常多样化,但不影响使用者,因此本文基本涉及如何实现一个RPC系统. 认识 RPC (远程调用) 我们在各种操作系统

Java面试常问题:如何设计一个高并发系统?你该如何优雅的回答

面试原题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确实有真才实学,在互联网公司里干过高并发系统,那你确实拿 offer 基本如探囊取物,没啥问题.面试官也绝对不会这样来问你,否则他就是蠢. 假设你在某知名电商公司干过高并发系统,用户上亿,一天流量几十亿,高峰期并发量上万,甚至是十万.那么人家一定会仔细盘问你的系统架构,你们系统啥架构?怎么部署的?部

深度学习:从头设计一个TensorFlow3一样的新一代深度学习系统,到底需要把握哪些要点?

深度学习工具潮流滚滚,各种工具层出不穷.也有各种文章从易用性,可移植性,灵活性和效率方面对于各个系统进行比较.这篇文章希望从系统设计上面来讲来回答这个讨论这个问题:如果想到从头设计一个TensorFlow3一样的新一代深度学习系统,到底需要把握哪些要点. 计算单元:从layer abstraction到operator 大家熟悉的第一代深度学习系统,以cuda-convnet21和caffe为代表.这些系统主要的一大特点是提出了一个以深度学习计算层次layer为基本单元的计算单位.不同的laye

Linux下一个简单的日志系统的设计及其C代码实现

1.概述 在大型软件系统中,为了监测软件运行状况及排查软件故障,一般都会要求软件程序在运行的过程中产生日志文件.在日志文件中存放程序流程中的一些重要信息, 包括:变量名称及其值.消息结构定义.函数返回值及其执行情况.脚本执行及调用情况等.通过阅读日志文件,我们能够较快地跟踪程序流程,并发现程序问题. 因此,熟练掌握日志系统的编写方法并快速地阅读日志文件,是对一个软件开发工程师的基本要求. 本文详细地介绍了Linux下一个简单的日志系统的设计方法,并给出了其C代码实现.本文为相关开发项目Linux