预先填充的Trie

时间:2011-11-02 04:59:01

标签: android sqlite trie

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

问题:

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

1 个答案:

答案 0 :(得分:0)

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

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

如果你只想完成单词的开头,那么只使用他们的香草indexes应该绰绰有余。如果性能有问题,那么只需等到它们在执行查询之前输入三个字符。为快速响应设置结果限制。