【问题标题】:Fastest way to build an index (list of substrings with lines of occurrence) of a String?建立字符串索引(带有出现行的子字符串列表)的最快方法?
【发布时间】:2016-12-29 03:32:36
【问题描述】:

问题:

本质上,我的目标是从文本文件构建 IndexEntry 对象的 ArrayList。 IndexEntry 具有以下字段:String word,表示文本文件中的这个唯一词,以及 ArrayList numsList,包含文本文件的行的列表,其中 单词出现。

我构建的 ArrayList 必须保持 IndexEntries 排序,以便它们的 word 字段按字母顺序排列。但是,我想以最快的方式做到这一点。目前,我访问文本文件中出现的每个单词,并使用二进制搜索来确定该单词的 IndexEntry 是否已经存在,以便将当前行号添加到其 numsList。在 IndexEntry 不存在的情况下,我会在适当的位置创建一个新的,以保持字母顺序。

示例:

_

一个

两个

一个

三个

_

将产生一个 IndexEntries 的 ArrayList,其输出为字符串(按 wordnumsList 的顺序)是:

一个 [1, 5],三个 [7],两个 [3]

请记住,我正在处理更大的文本文件,其中包含许多相同的单词。

问题:

二分查找是解决这个问题的最快方法吗?我仍然是 Java 编程的新手,并且对搜索在这种情况下可能表现更好的算法或与我当前的解决方案相比使用哈希表的相对时间复杂度感到好奇。

【问题讨论】:

  • 首先尝试使用Map 而不是List。它将提供恒定的时间查找性能。构建地图后,将其转换为您的愿望清单。
  • Java 已经有一个类。你想要一个Map<String, Set<Integer>>

标签: java sorting arraylist


【解决方案1】:

您可以尝试使用 TreeMap 或 ConcurrentSkipListMap 来保持索引排序。

但是,如果您只需要在索引结束时的排序列表,那么好的旧 HashMap 是要走的路(ArrayList 作为值可能也是一个安全的选择) 完成后,获取地图的值并按键排序一次。

对于几百兆字节的文本文件应该足够了。

如果您使用的是 Java 8,请使用简洁的 computeIfAbsentcomputeIfPresent 方法。

【讨论】:

  • 所有这些都可以优化,直到奶牛回家,但一如既往:先测量,然后优化
猜你喜欢
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多