预填充的Trie树

4

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

问题:

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

0

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

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

如果你只想完成单词的开头,那么只使用他们的基本索引应该已经足够了。如果性能是一个问题,那么等待他们输入三个字符再进行查询。为了快速响应,设置结果的限制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接