草庐IT

android - 预先填充的特里

coder 2023-12-24 原文

背景:
我的 CSS360 小组正在尝试创建一个包含自动完成搜索功能的 Android 应用程序。我们要搜索的数据包含大约 7000 个条目,并将存储在手机本身的 SQLite 数据库中。最明显的方法是在用户键入的每个字符之后对数据库进行线性搜索,然后返回一个建议列表,这些建议是用户查询的潜在字母扩展。然而,这似乎效率很低,我们一直在寻找更好的替代方案。在我今天的另一个类中,我的讲师简要讨论了 trie 数据结构,并提到它通常用于存储整个字典。 trie 的条目可以以对数时间检索(与常规旧数组的线性时间相反),因此这对我们来说似乎是一个很好的工具!不幸的是,我们已经在这个项目上陷入困境,而且我们都不知道如何实现这一目标。迄今为止,我们编写的所有代码都是基本的控制台应用程序,用于教授我们编程基础知识。我们都试图通过观看 YouTube 视频在一周的时间内学习 Android 平台,并将数据库内容与我们组中具有任何 SQL 经验的人进行区分。我们可以认真地使用一些指示!

问题:

  • 创建 trie 树时,是否可以预先填充整个结构? IE:为每个使用的节点生成一行代码,这样整个结构在程序启动时就已经在内存中了?我的想法是,这将为我们节省每次程序启动时必须从数据库重新生成整个 trie 的开销。如果是这样,是否有一种简单的方法可以将这数千行代码放入我们的程序中? IE:某种脚本可以将数据库文件转换为一个巨大的 java 命令文本文件,可以将其复制并粘贴到 Eclipse 中?
  • 如果我们直接搜索数据库而不是使用某种内部列表或数据结构,是否会有大量开销?我们是否应该将姓名从数据库中复制出来并在程序中搜索它们以获得我们的自动完成功能?
  • 如果这对我们来说在技术上太难了,我们不得不求助于常规的线性搜索,性能是否会受到显着影响?
  • 我们目前的计划是在用户每次输入字符时运行自动完成功能,然后等待该功能返回,然后再让他们继续输入。到目前为止,我们编写的唯一程序是这样同步运行的。我们需要知道什么才能异步执行此功能?考虑到我们的新手能力以及我们已经必须满足的要求,这对我们来说在技术上是否具有挑战性?

最佳答案

sqlite 应该能够很好地提供这种自动完成功能。我建议使用他们的内部索引而不是重新实现轮子。如果您需要执行后者,那么在您完成该工作后,sqlite 可能不会帮助您。

如果你想搜索子串,那么full text search可能是您最好的选择。

如果您只想完成单词的开头,那么只需使用他们的 vanilla indexes应该绰绰有余。如果性能有问题,那么只需等到他们键入三个字符后再进行查询。为快速响应设置结果限制。

关于android - 预先填充的特里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975979/

有关android - 预先填充的特里的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  5. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  6. ruby-on-rails - 用一系列时间增量填充选择,加上其他选项 - 2

    使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour

  7. ruby-on-rails - 将没有默认值的 NOT NULL 字段添加到填充的数据库中 - 2

    我有一个表,我们称它为MyTable。它是Postgresql数据库的一部分。MyTable中有很多条目,比方说超过一百万。我想向该表中添加一个字段,我们将其命名为MyNewField。它由ActiveRecord迁移添加。此字段没有默认值且不可为空。结果,在它的迁移类中将是这样的:classAddMyFieldToMyTable但是,它会触发一个错误(PG::NotNullViolation),因为该表已经包含行,所有这些行的MyField都设置为NULL。我想做的是:添加没有默认值且可空设置为false的行(不触发PG::NotNullViolation)。然后,将另一个表中的值插

  8. ruby-on-rails - 如何按照散列中的数字序列生成和填充缺失数据 - 2

    我正在尝试创建一个函数来完成以下哈希中的小时序列。{name:"cardio",data:[["06:00",999],["09:00",154],["10:00",1059],["11:00",90]]}它应该在字段数据中创建所有缺失值["07:00",0],["08:00",0],["12:00",0],["13:00",0]...["23:00",0]预期结果:{name:"cardio",data:[["06:00",999],["07:00",0],["08:00",0],["09:00",154],["10:00",1059],["11:00",90]],["12:00",

  9. ruby-on-rails - 如何为特色对象预填充表单? - 2

    用户可以输入自定义:action或选择特色:action:Orchooseafeaturedchallenge:如果用户选择特色:action,新的挑战/_form会预先填充他选择的:action,但现在我想把它带到在您的帮助下更上一层楼!Challenge:DoOn:DoFor:如何预填充特色挑战的其他属性,例如“DoFor”或“DoOn”?例如,如果用户选择特色:action:'RunaMile那么我会用RunaMile预填充表单>,周一、周三、周五,30天。 最佳答案 您可以将simple_form与reform一起使用。Re

  10. ruby-on-rails - Rails 4 — 如何从 JSON API 填充用户模型? - 2

    首先,我是Rails的新手,如果有任何我不理解的地方,请见谅。我想知道如何通过API获取数据来填充模型。上下文:我正在使用带有omniauth/devise的OAuth2身份验证。在我的用户Controller客户端(与提供者相对)中,我获取了所有至少登录一次的用户就是这个“客户端应用程序”,我想显示它们。显然,每当新用户登录到客户端应用程序时,我不会将他的所有信息存储在客户端数据库中以避免重复。我存储的只是user_id及其访问token。因此,我想在获取所有用户数据后,我可以将它们填充到用户模型,然后再将其传递给View。做这样的事情最好的方法是什么?我正在研究命名范围,但我不清楚

随机推荐