【问题标题】:Optimal search data structure最优搜索数据结构
【发布时间】:2013-04-21 18:18:14
【问题描述】:

我在发布之前搜索了这个,但我找不到对我有帮助的东西。 我正在使用java。我有一个 300.000 字的文件(已经按字母顺序排序)。 我想在结构中加载这些单词并搜索我将通过的单词 存在与否。我想要最适合字符串搜索的东西。我看过关于 尝试(后缀树)和红黑树(TreeSet - 因为我只想要键,并且 没有值 - 在 java 中)。

如果您考虑回答,请提供有关效率的一些解释 你的提议。谢谢。

编辑 结构将通过加载文件创建,不再有 添加单词。 不需要区分大小写。 我不知道什么是词干。我现在知道了,但我不知道它是否会有所帮助。 该文件是一本字典(没有翻译,只有给定语言的单词)。

【问题讨论】:

  • 区分大小写是否重要?你在使用词干吗?您打算添加更多单词吗?我个人使用尝试。
  • 如果你必须使用 JDK 类,我会选择Set<String>。您可以通过它的一些实现来备份它:HashSet<String>LinkedHashSet<String>TreeSet<String>,具体取决于您在使用 Set<String> 时的需要。
  • 我不必这样做,但这对我来说会更容易。您为什么不将此作为答案发布?我已经编辑了我的问题。请提供您的意见。你会怎么做?感谢您的帮助

标签: java search tree large-files


【解决方案1】:

哈希将是您的最佳解决方案。它以与树集相对的恒定时间进行搜索,即 log(n) 时间。

如果您在创建时声明的集合足够大,您也可以在恒定时间内存储。

http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html

创建时间为:n,您需要将排序集包含在单独的结构中。

这是一个针对重复搜索而不是内存或添加数据而优化的解决方案。

【讨论】:

  • 我建议你链接到HashSet,因为 OP 没有键/值对。
  • 通过您的编辑,我会说 HashMap 就足够了。您创建了具有 n (300.000) 次操作的集合,并且可以从那里使用单个(恒定时间)操作进行读取。
  • 这将是 jlordo 提到的 HashSet。我只有键,没有值。 TreeSet 将是 O(logn) 和 HashSet O(n)。对于这种大小的数据,如果是对数会不会更好?
  • Hashset 的最坏情况查找为 O(n),但平均情况为 O(1)。另外,一个Treeset需要对compareTo进行重复调用,字符串大小为O(n); Hashset 只需要比较哈希码(恒定时间)以及对equal 的一次调用(字符串大小为 O(n))
  • 感谢 Zim-Zam 的详细解释。
猜你喜欢
  • 2016-11-24
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多