十大热门搜索
我们在使用百度或者google搜索时,他们会给我们列出以搜索词为前缀的十大热门搜索词,
现在我们就来一步步实现这个功能。思考了一下,主要分为以下几步:
产生测试数据
根据搜索词来找出以其为前缀的词,前缀匹配
根据第2步的结果,找出前10个词
前端展示
1. 产生测试数据
1 | var fs = require('fs'); |
2. 前缀匹配
这里我采用了字典树,每个节点记录该节点的字符ch
以及词频num
,
在进行前缀匹配的时候将从根节点到当前节点形成的词记录在prefix
中
1 | function TreeNode(ch) { |
3. 根据前缀匹配的结果
找出一个数组(大小为k)的前n个最大值有几种方法,最容易想到的就是排序,
但是其时间复杂度为O(k*k)
。这里打算借用堆来实现,算法复杂度为O(k*logn)
:
- 若是数组大小小于等于n,则直接返回数组
- 用数组前n个数建立小顶堆
- 将数组剩下的元素与堆顶元素比较,若是大于堆顶元素,则进行替换,并调整堆为小顶堆
- 返回堆中所有的元素
1 | /** |
4. 前端展示
更多详见github