java - 是否有一些更好的方法可以在您使用相当小的数据集输入 Java 时实现查找?

标签 java algorithm data-structures

我在一个文件中有大约 2500 个短语。我希望能够在输入可能的子字符串时找到短语。我的应用程序有一个文本框和一个短语列表。文本框最初是空的,列表包含所有 2500 个短语,因为空字符串是所有短语的子字符串。当我在文本框中键入内容时,列表会更新,因此它始终只包含以文本框的值作为子字符串的短语。

目前我有一个 Google 的 Multimaps,具体来说:

LinkedHashMultimap<String, String>

将每个可能的子字符串映射到它可能的匹配项。这需要一段时间才能加载(大约一秒钟),我认为它一定会占用相当多的空间(这可能是 future 的一个问题。)不过查找速度非常快。

有没有一种方法可以使用其他一些数据结构或策略来执行此操作,这些数据结构或策略可以更快地加载并占用更少的空间(可能以牺牲查找速度为代价)?

最佳答案

如果您的列表只包含 2500 个元素,一个简单的循环并检查所有元素的 contains() 应该足够快。

如果它变大和/或太慢,您可以应用一些简单的优化:

  • 不要在用户键入每个字符时立即进行搜索,而是引入一些延迟。因此,如果他非常快地键入“foobar”,您只搜索“foobar”,而不是先搜索“f”,然后搜索“fo”,然后搜索“foo”,...
  • 重复使用之前的结果:如果用户首先键入“foo”然后将其扩展为“foobar”,则不要再次在整个原始列表中搜索,而是在结果中搜索“foo”(因为包含“foobar”必须包含“foo”)。

根据我的经验,这些基本的优化已经让你走得很远了。

现在,如果列表增长得如此之大以至于速度太慢,则需要按照此处其他答案中提出的一些“更智能”的优化(尝试、后缀树等)。

关于java - 是否有一些更好的方法可以在您使用相当小的数据集输入 Java 时实现查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2410320/

相关文章:

java - 我的 Intellij IDEA jdk 设置完全困惑,有人可以帮助我吗?

java - 我可以将 @ComponentScan 和 @Autowired 与 BasicDataSource 一起使用,而无需在 XML 中为 BasicDataSource 类声明 bean 吗?

java - 尝试按列表项对 HashMap<String, List<String>> 进行排序

java - 在 ConcurrentSkipListMap/ConcurrentSkipListSet 中重新排序键的原子方式?

data-structures - 如何在 PLT Scheme 中打印结构以显示其字段?

java - 使用java插入二叉树不起作用

java - Java 中的泛型方法模式

java - Android SQLite 查询

performance - 快速任意角度寻路

算法或生成器或示例道路车道/和网络