再谈type ahead 问题

2023-11-04

问题:给定一个词典,包括一些词和其出现的频率。实现type ahead功能,要求用户每键入一个字符,下拉框显示以当前输入为前缀的前10个最热门的词


解法1:用不带data的Trie,(data仅仅是词频)实时查询法,需要实时的去build hot list

框架就是Triie的 startWithPrefix 查询,不同的是并不是返回遍历得到的所有词,而是像经典求top k那样,用一个大小为k的最小堆过滤。

struct TrieNode {
	int data;
	TrieNode *next[256];
};
TrieNode* put(TrieNode* x, string word, int i, int data) {
	if (x == nullptr) x = new TrieNode();
	if (i == word.size()) { x->data = data; return x; }
	x->next[word[i]] = put(x->next[word[i]], word, i + 1, data);
	return x;
}
TrieNode * buildTrie(map<string, int> &dict) {
	TrieNode* root = new TrieNode();
	for (auto & entry : dict) {
		put(root, entry.first, 0, entry.second);
	}
	return root;
}
class TypeAhead {
private:
	stack<TrieNode*> path;
	string prefix;
	stack<vector<string>> cache;
	typedef pair<int, string> P;
	void collect(TrieNode *x, string prefix, priority_queue<P, vector<P>, greater<P>> &pq) {
		if (x == nullptr) return;
		if (x->data > 0) {//is key
			pq.push(make_pair(x->data, prefix));
			if (pq.size() > 10) pq.pop();
		}
		for (char c = 0; c < 256; ++c)
			collect(x->next[c], prefix + c, pq);
	}
public:
	TypeAhead(TrieNode* root) { path.push(root); }
	vector<string> type(char c) {
		prefix.push_back(c);
		if (path.top() != nullptr) path.push(path.top()->next[c]);
		else path.push(nullptr);

		if (path.top() == nullptr) {
			cache.push({});
			return {};
		}
		priority_queue<P, vector<P>, greater<P>> pq;
		collect(path.top(), prefix, pq);
		vector<string> dropList;
		for (; pq.size() > 0; pq.pop()) { dropList.push_back(pq.top().second); }
		cache.push(dropList);
		return dropList;
	}
	vector<string> back() {
		if (path.size() == 1) return{};
		path.pop();
		prefix.pop_back();
		cache.pop();
		return cache.top();
	}
};



解法2: 用 带data的 Trie,data就是该前缀下 最热的十个词,查询时候直接返回hot list

build trie 有所不同,遍历词典,把每个词所有前缀对应的节点都link到该词,每个节点的拉链就是一个大小为k的最小堆,


解法3: 还是用带data的 trie,词典预先按词频降序排列,然后按顺序插入Trie,也是把词加入到其每个前缀节点的拉链,拉链大小超过10后就不插了,



第一种方法,build trie时候就是传统的build trie, 查询相对复杂

第二三种方法,是invert index,定位到key后,直接返回数据就行 (top 10 拉链)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

再谈type ahead 问题 的相关文章

  • 2023 Google 开发者大会,共创、赋能开发者

    前言 9月6日 2023 Google 开发者大会在上海拉开帷幕 在本次大会 Google 将技术灵感带到了中国 在为期两天的大会中 让我印象最为深刻的是 谷歌帮助中国开发者释放潜能 持续创新 落地创意灵感 不管你是 Mobile 开发者
  • 算子策略如何配,调试宝典帮你忙

    前面几期讲解了网络构建与训练类报错中各类错误的定位解决方法 相信大家应该对于此类问题有一些较为深入的认识了 在深度学习中 当数据集和参数量的规模越来越大 训练所需的时间和硬件资源会随之增加 最后会变成制约训练的瓶颈 分布式并行训练 可以降低

随机推荐

  • JSVC简介之快速入门

    1 JSVC简介 Apache基金会会common 类似于guava 项目下的项目 2 为什么要使用JSVC java应用增加一种启动方式 Java的缺点 只能用main方法启动 应用能使用1024以下端口 为啥tomcat可以指定端口 系
  • python中多线程编程中eoferror_面试官:请你讲讲Python多线程多进程编程

    Python多线程多进程文章目录并行和并发的概念 线程和进程的概念 来点八股文 PythonGIL锁相关以及历史 多线程编程详解 多进程编程详解 重点 一 什么是并行和并发 首先我们来先说一下一个简单的共同点 并行和并发都是完成多任务更加有
  • python QMessageBox设置标签和按钮居中、中文按钮

    from PyQt5 QtCore import Qt from PyQt5 QtWidgets import QApplication QMessageBox QLabel QDialogButtonBox from PyQt5 QtGu
  • IDEA报错 Cannot resolve method ‘xxx‘ in ‘xxx‘

    今天在用Logback做一个小项目的时候 出现了这个bug 一下子给我报了50个错误 如下图所示 后面经过10分钟左右的排查 在网上搜寻解决方式 网上的解决方案差不多有以下三种 1 重装Logback 2 清除IDE缓存 3 重新导包导库
  • 写入位置时发生访问冲突

    写入位置时发生访问冲突是因为待写入的内存空间不能被写入 可能的情况 给野指针赋值 通常在调试的时候 如果一个指针指向的地址为0x00000000那么表示这个指针不指向任何地址 参考文章 1 2
  • Lesson40 FIFO的配置与使用

    摄像头的FIFO配置使用 一 FIFO的基本工作原理讲解 二 Vivado中FIFO IP的添加和基本配置 三 IP文档资料的获取方法 四 编写测试脚本 1 复制 FIFO 的例化模板 2 新建存放FIFO仿真文件的文件夹 3 全部的仿真代
  • 用opencv简单的检测三角形、正方形、圆以及它们的颜色

    源码下载地址点击打开链接 原始图片 检测结果 检测后图片 下面为完整代码 include
  • 【雕爷学编程】Arduino动手做(65)---红外寻迹传感器

    37款传感器与执行器的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止这37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手尝试系列实验 不管
  • C++ 类模板

    目录 1 定义 2 验证类模板生成的类定义 3 非类型参数 4 模板别名 5 模板类 6 多个参数类型 7 类型参数默认值 8 模板类作为模板函数的入参 9 模板具体化 10 成员模板 11 将模板类用作类型参数 12 模板类中的友元 1
  • GPT模型介绍并且使用pytorch实现一个小型GPT中文闲聊系统

    文章目录 GPT模型介绍 无监督训练方式 模型结构 微调 下游任务输入形式 GPT 2 GPT 3 pytorch实现一个小型GPT中文闲聊系统 GPT模型介绍 GPT与BERT一样也是一种预训练模型 与BERT不同的是 GPT使用的是Tr
  • 【转载】LaTeX 各种命令和符号

    LaTeX 各种命令 符号 前言 前言 在别人博客看到特别好的介绍LaTeX 各种命令 符号 而自己又经常需要查阅 所以转载过来到自己的博客以便自己后续学习 特别好的整理 再次感谢博主 同时也是自己第一篇转载的文章hhh 函数 符号及特殊字
  • C#使用操作系统默认程序打开pdf,支持.NET Core跨平台,无视平台差异

    C 使用操作系统默认程序打开pdf 支持 NET Core跨平台 无视平台差异 System Diagnostics Process Start explorer D pdf 638086539413135758 pdf 参考文章 1 ht
  • uni、js——点击与禁用(不可点击)、动态样式class

    案例 没约满的时间可以点击进行选择 约满的就不能选择了 选择完之后变色变字 核心思想就是创建一个第三方变量存起来 点击谁就存到第三方 在根据这个进行判断 代码
  • 面试中 项目遇见的难点答案_2019 百度、头条、小米、360、网易、拼多多等公司 Android 社招面试心得...

    每到 金三银四 的季节 总人很多人去寻找名叫 面经 一样的东西 其实就是一个个具体的题目 然后临阵磨枪 去 背 答案 如果一直是这样的话 我相信你的能力不会有任何提高 即使工作三年五年也达不到高级工程师的水平 事实证明这类 程序员 占大多数
  • 测试技术

    单元测试的策略 逻辑覆盖 循环覆盖 同行评审 桌前检查 代码走查 代码评审 景泰数据流分析 白盒测试方法 六种覆盖方法中 覆盖准则由弱到强依次是语句覆盖 判定覆盖 分支覆盖 条件覆盖 判定 条件覆盖 条件组合覆盖 路径覆盖 其中 语句覆盖是
  • mysqld: File ‘./binlog.index‘ not found (OS errno 13 - Permission denied)

    背景 CentOS Stream 9安装Mysql8 0社区版时 为了修改端口 增加了my cnf文件 发现重启后报错 binlog index找不到 解决方法 1 关掉SELINUX root 192 mysql vi etc selin
  • JAVA异常实验:车站检查危险品的设备,如果发现危险品会发出警告。编程模拟设备发现危险品

    车站检查危险品的设备 如果发现危险品会发出警告 编程模拟设备发现危险品 编写能够满足如下条件的程序 编写一个Exception的子类DangerException 该子类可以创建异常对象 该异常对象调用showMessage 方法输出 属于
  • Spring MVC 源码分析之 加载及查找 Controller

    目录 一 前言 二 查找Handler 2 1 回顾 doDispatch 2 2 查看 getHandler方法 2 3 handlerMappings的前世今生 三 补充说明 1 通过 方式 2 SpringBoot方式 四 总结 一
  • python中request、lxml、xpath使用

    request lxml xpath request 环境搭建 pip install requests 使用方法 下载完包之后 在项目中引入包 import requests 发送请求 get请求 import requests 通过re
  • 再谈type ahead 问题

    问题 给定一个词典 包括一些词和其出现的频率 实现type ahead功能 要求用户每键入一个字符 下拉框显示以当前输入为前缀的前10个最热门的词 解法1 用不带data的Trie data仅仅是词频 实时查询法 需要实时的去build h