键入字符时搜索字符串

2024-03-23

我的手机中存储了联系人。假设我的联系人是

Ram

Hello

Hi

Feat

Eat

At

当我打字时'A'我应该得到所有匹配的联系人说"Ram, Feat, Eat, At".

现在我再输入一个字母T。现在我的总字符串是"AT"现在我的程序应该重用之前搜索的结果"A"。现在它应该返回我"Feat, Eat, At"

为此设计并开发一个程序。

这是三星移动开发的面试问题

我尝试解决Trie data structures。无法获得重新使用已搜索的字符串结果的良好解决方案。我还尝试了字典数据结构的解决方案,解决方案具有与Trie.

问题是如何使用先前搜索字符串的搜索结果来搜索输入的每个字母的联系人?应该使用什么数据结构和算法来有效地解决问题。

我不是要节目。所以编程语言对我来说并不重要。

状态机似乎是一个很好的解决方案。有人有建议吗?

解决方案的速度应该足以容纳数百万个联系人。


这在某种程度上取决于您要搜索的项目数量。如果列表相对较小,您可以执行以下操作string.contains检查一切。因此,当用户输入“A”时,您将搜索整个列表:

for each contact in contacts
    if contact.Name.Contains("A")
        Add contact to results

然后用户输入“T”,你依次搜索之前返回的结果:

for each contact in results
    if contact.Name.Contains("AT")
        Add contact to new search results

如果联系人列表很大,事情会变得更有趣,但对于手机中通常拥有的联系人数量(一千个就很多了!),这将非常有效。

如果面试官说“使用之前搜索的结果进行新的搜索”,那么我怀疑这就是他正在寻找的答案。创建新的后缀树比顺序搜索先前的结果集需要更长的时间。

您可以通过将子字符串的位置与联系人一起存储来对此进行优化,以便下次您要做的就是检查下一个字符是否符合预期,但这样做会使算法有点复杂(您必须将第一次搜索视为特殊情况,并且必须显式检查字符串长度等),并且在前几个字符之后不太可能提供太多好处,因为要搜索的列表的大小会非常小。纯顺序搜索contains检查速度会很快。用户不会注意到通过优化节省的几微秒。

编辑问题后更新

如果您想对一百万个联系人执行此操作,顺序搜索可能不是一开始的最佳方法。虽然我还是想尝试一下。 “足够快,可容纳一百万次联系人”提出了“足够快”究竟意味着什么的问题。在 100 万个联系人中搜索是否存在单个字母需要多长时间?用户愿意等待多长时间?还要记住,您只需show用户执行另一操作之前的一页联系人。您几乎可以肯定在用户按下第二个键之前就可以做到这一点。特别是如果您有一个后台线程执行搜索,而前台线程处理输入并将匹配字符串的第一页写入显示。

无论如何,您可以通过创建二元索引来加快初始搜索速度。也就是说,对于每个二元组(两个字符的序列),构建包含该二元组的名称列表。您还需要为每个字符创建一个字符串列表。因此,根据您的姓名列表,您将拥有:

r - ram
a - ram, feat, eat, a
m - ram
h - hello, hi
...
ra - ram
am - ram
...
at - feat, eat, at
...
etc.

我想你应该已经明白了。

该二元索引存储在字典或哈希图中。英语中只有 325 个可能的二元组,当然还有 26 个字母,所以你的字典最多有 351 个条目。

因此,您几乎可以立即查找 1 个字符和 2 个字符的名称。这对你有什么帮助?

古腾堡计划文本分析 http://www3.nd.edu/~busiforc/handouts/cryptography/Letter%20Frequencies.html表明英语中最常见的二元组仅出现 3.8% 的时间。我意识到名字不会完全共享这个分布,但这是一个相当不错的粗略数字。因此,在输入前两个字符后,您可能会使用列表中不到 5% 的名称。一百万的百分之五就是五万。只需 50,000 个名称,您就可以开始使用我最初描述的顺序搜索算法。

这种新结构的成本并不算太糟糕,尽管它足够昂贵,无论如何我肯定会首先尝试简单的顺序搜索。在最坏的情况下,这将导致您额外花费 200 万次对名称的引用。如果您构建一个 2 级 trie 而不是字典,则可以将其减少到一百万个额外引用。那需要slightly查找和显示单字符搜索结果的时间较长,但不足以引起用户的注意。

这种结构也很容易更新。要添加名称,只需浏览字符串并输入适当的字符和二元组即可。要删除名称,请通过提取二元组的名称,然后从二元组索引中的相应列表中删除该名称。

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

键入字符时搜索字符串 的相关文章

  • 分词统计方法

    我想解决分词问题 从没有空格的长字符串中解析单词 例如我们想要从中提取单词somelongword to some long word 我们可以通过字典的动态方法来实现这一点 但我们遇到的另一个问题是解析歧义 IE orcore gt or
  • 对二进制二维矩阵进行排序?

    我在这里寻找一些指示 因为我不太知道从哪里开始研究这个 我有一个二维矩阵 每个单元格中有 0 或 1 例如 1 2 3 4 A 0 1 1 0 B 1 1 1 0 C 0 1 0 0 D 1 1 0 0 我想对其进行排序 使其尽可能 上三角
  • pyExcelerator 或 xlrd - 如何查找/搜索给定几列数据的行?

    Python 与 EXCEL 通信 我需要找到一种方法 以便我可以查找 搜索给定列数据的行 现在 我正在逐一扫描整个行 这将很有用 如果有一些功能 如查找 搜索 替换 我在 pyExcelerator 或 xlrd 模块中没有看到这些功能
  • 生成字符串及其子字符串列表的排列的算法

    我已经忘记这个算法有一段时间了 假设我得到了字符串 cccaatt 我试图生成重复字母的每个子串的所有可能变体 EG cccaatt 作为输入将返回 猫 卡特 猫 卡特 ccat 卡特 卡特彼勒 卡特彼勒 cccat cccat cccaa
  • 计算 Adamic-Adar 的快速算法

    我正在研究图形分析 我想计算一个 N N 相似度矩阵 其中包含每两个顶点之间的 Adamic Adar 相似度 为了概述 Adamic Adar 让我从以下介绍开始 给定邻接矩阵A无向图的G CN是两个顶点的所有公共邻居的集合x y 两个顶
  • 什么是确定性快速排序?

    我一直在阅读有关快速排序的内容 发现有时它被称为 确定性快速排序 这是普通快速排序的替代版本吗 普通快速排序和确定性快速排序有什么区别 普通 确定性 快速排序在特定数据集上的行为可能非常差 例如 选择第一个未排序元素的实现在已排序数据上的时
  • 优化 HTML 属性压缩顺序

    我在某处读到 按一定顺序组织 HTML 属性可以提高 HTML 文档的压缩率 我想我是从 Google 或 Yahoo 推荐的更快网站上读到这篇文章的 如果我没记错的话 建议是将最常见的属性放在第一位 例如id等 然后将其余的按字母顺序排列
  • 所有可能的骑士在普罗梅拉的棋盘上移动

    是否有可能用马从初始位置 I J 绕过大小为 N N 的棋盘 并且只访问每个方格一次 define A True A I J false active proctype method bit I 4 bit J 3 bit K 1 bit
  • StackOverflowError 计算 BigInteger 的阶乘?

    我正在尝试编写一个Java程序来计算大数的阶乘 它似乎BigInteger无法容纳这么大的数量 下面是我编写的 简单的 代码 public static BigInteger getFactorial BigInteger num if n
  • 数组中最远的相等元素

    假设你有一个未排序的数组 你如何找到两个相等的元素 使它们成为数组中最远的元素 例如8 7 3 4 7 5 3 9 3 7 9 0ans 将是7 9 7 1 8 我想到了以下几点 initialise max 0 using hashing
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 使用 Numba 加速矢量距离计算

    以下是我为 3 D 环形几何中的距离 平方 计算编写的一些函数 用于该 3 D 空间中的粒子集合 import itertools import time import numpy as np import scipy import num
  • 查找文本中所有关键字的有效算法

    我有很多字符串 其中包含许多不同拼写的文本 我通过搜索关键字来标记这些字符串 如果找到关键字 我将使用该关键字的关联文本 假设搜索字符串可以包含文本 schw schwa 和 施瓦茨 我有三个关键字 全部解析为文本 schwarz 现在我正
  • 计算字符串的所有子串中子序列的出现次数

    我想编写一个算法来计算字符串的所有子字符串中字符子序列 不相交 出现的总数 下面是一个例子 字符串 jabcohnnyjohnny 后续 约翰尼 包含子序列的子字符串 jabcohnny jabcohnnyj jabcohnnyjo jab
  • Ruby 在带有偏移量的数组中查找

    我正在寻找一种以更简洁的方式在 Ruby 中执行以下操作的方法 class Array def find index with offset offset block offset 1 find block end end offset a
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 如何在 Google 知识图谱中搜索具有特定属性的条目?

    应如何制定搜索查询kgsearch googleapis com查找给定类别中的所有条目 例如 如果我想搜索 Schema org 类别中的内容应用类别 http schema org applicationCategory 我该怎么办呢
  • 使用php表单更改href链接

    我正在制作一个带有搜索栏的网站 我想让搜索栏在 搜索 并显示结果后具有交互性 所以我希望 href 根据正在使用的 Id 进行更改 例如 有人搜索 Pinecones 如果它在数据库中 它将有一个 ID 在本例中是 4 一旦他们搜索它 它就
  • 如何求两个地点的经纬度距离?

    我有一组位置的纬度和经度 怎么找distance从集合中的一个位置到另一个位置 有公式吗 半正矢公式假定地球是球形的 然而 地球的形状更为复杂 扁球体模型会给出更好的结果 如果需要这样的精度 你应该更好地使用文森特逆公式 See http

随机推荐

  • jenkinsfile 管道按代理分组阶段

    我有什么 我正在尝试使用两种不同的代理来运行我的詹金斯管道 我想在同一个代理上执行某些流程 但到目前为止我无法执行此操作 因为代理定义只有 2 个选项 我可以在管道顶部执行 或者我可以将代理定义到每个阶段 我有这个 pipeline age
  • 用 CSS 使图像变灰?

    使用 CSS 让图像显示为 灰色 的最佳方法 如果有 是什么 即不加载单独的灰色图像版本 我的上下文是 表格中的行在最右侧的单元格中都有按钮 并且某些行需要看起来比其他行更亮 因此 我当然可以轻松地使字体变亮 但我也希望使图像变亮 而不必管
  • Python pandas系列:将浮点数转换为字符串,保留空值

    转换为字符串后如何保留空值 我正在处理社会安全号码 需要在浮点数和字符串之间来回切换 import pandas as pd import numpy as np x pd Series np nan 123 np nan 456 dtyp
  • 如何使用phpmyadmin导出所有数据库

    可以使用phpMyadmin一次性导出所有数据库吗 如果不是 最好的方法是什么 提前致谢 以下是使用 phpMyAdmin 导出所有 mySQL 数据库的步骤 2015 年 12 月 随着 phpMyAdmin 的发展 添加了新功能 打开
  • 当 setup.py 使用 Python 版本 3 解释器运行时,如何构建 py2 轮包?

    我有一个应该是 Python 的包仅版本 2但需要构建运行版本 3 解释器 The setup py这个包的内容看起来像点击 from setuptools import setup setup python requires lt 3 0
  • “编辑前 200 行”不适用于 SQL Server 16.0 - Express Edition

    我正在尝试在 SQL Server Express 版本中 编辑前 200 行 但它返回的是空白文件 如下所示 显示带有禁用工具的空白文件 https i stack imgur com CvpH7 png 我已经在本地安装了这个 SQL
  • 将渐变效果应用于模糊视图

    如何在 Swift 中添加具有模糊效果的渐变视图 我可以很轻松地向视图添加渐变层 CAGradientLayer 我还可以单独添加模糊视图 UIVisualEffectView 如何将两者结合起来创建一个模糊视图 该视图还具有渐变元素 其中
  • 当我单击画布并拖动鼠标时,光标会变为文本选择光标。我怎样才能防止这种情况发生?

    这是一个小提琴 http jsfiddle net MZ9Xm http jsfiddle net MZ9Xm 注意 以下情况发生在 Chrome 22 0 1221 1 中 但不会发生在 Firefox 14 0 1 中 Ubuntu l
  • Java 随机崩溃(可能的罪魁祸首:ntdll.dll?)

    我有一个用 Java 编写的程序 并使用 Windows 任务计划程序设置为每 5 分钟运行一次 它执行 C Program Files Java jre7 bin javaw exe 并传递 jar 文件和所有命令行参数 在大多数情况下
  • 如何安全地镜像 git 存储库?

    我想通过后台作业镜像一些 git 存储库 git clone mirror and git remote update不会保留通过强制推送未引用的对象 但我也想保留这些对象以防黑客攻击 有没有什么工具可以执行安全的 git 镜像 虽然缺少
  • Tone.PitchShift 和 Howler.js 问题

    我喜欢在我的 Meteor 应用程序中使用 Howler js 然而 播放速率功能导致了我不想要的音调变化 我只想延长时间 并保持音调 因此 我的解决方案是对其进行音调变换以 纠正 音调 看起来很简单 这就是我选择使用的原因https to
  • 在 Qt 中显示 QImage 的灰度并调整其大小

    我已经能够使用如下内容在 Qt 中的标签中显示图像 transformPixels 0 0 1 imheight imwidth 1 sets unsigned char imageData unsigned char fullCharAr
  • 与Netty相比,vert.x如何实现卓越的性能?

    最近的TechEmpower 性能基准 http www techempower com benchmarks 一直在 Netty 之上展示 vert x 有时数量很大 根据其网站 vert x 使用 Netty 来实现 大部分网络 IO
  • jquery:无法获取div的“value”属性

    这是我的 chrome javascript 控制台的屏幕截图 展示了我的困境 我真的无法理解为什么我无法获取 值 属性 class 属性工作得很好 所以我认为同样应该适用于 value 我在我的应用程序中测试的代码 coffeescrip
  • 没有WebRTC的nodeJS中的简单SIP电话

    您好 我需要实现类似 SIP 电话的功能 但使用不带 WebRTC 的 经典 SIP 大多数 JS 库都专注于基于 websockets 和 WebRTC 的 SIP 但在我的基础设施中 我没有 WebSocket 有像 JsSIP 这样的
  • PHP preg_match_all:提取逗号分隔列表

    例如 我有以下字符串 WIDGET TEST abc 456 我希望能够使用 preg match all 返回逗号分隔参数的数组 有人可以帮我解决我需要的正则表达式吗 我已经尝试过 并且返回以下查询 a b preg match all
  • 方案中的延续传递风格?

    我遇到了这段代码在维基百科上 http en wikipedia org wiki Continuation passing style define pyth x y k x x lambda x2 y y lambda y2 x2 y2
  • 图像 PropertyItems 和已处置的 MemoryStream

    我正在加载一个Image from a byte using MemoryStream并通过检查图像来获取有关图像的信息ProperyItems 但在这样做的过程中 我注意到一些奇怪的行为 其中一些图像的PropertyItems正在消失
  • sqlite:如何获取组计数

    我在网站上有一个用户操作的 SQLite 表 每一行都是网站上的相同操作 只是时间 日期不同 并用用户 ID 标记 该表有超过 2000 万条条目 我了解如何使用按用户 ID 进行分组的功能来获取用户计数 即 A 执行了 3 次操作 B 4
  • 键入字符时搜索字符串

    我的手机中存储了联系人 假设我的联系人是 Ram Hello Hi Feat Eat At 当我打字时 A 我应该得到所有匹配的联系人说 Ram Feat Eat At 现在我再输入一个字母T 现在我的总字符串是 AT 现在我的程序应该重用