4

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

问题:

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

1 回答 1

0

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

如果您想要子字符串搜索,那么全文搜索可能是您最好的选择。

如果您只想完成单词的开头,那么仅使用它们的 vanilla索引就足够了。如果性能有问题,那么就等到他们输入三个字符后再进行查询。为快速响应的结果设置限制。

于 2013-12-21T17:06:06.163 回答