【问题标题】:Most efficient way to store and sort words by length?按长度存储和排序单词的最有效方法?
【发布时间】:2013-12-23 22:17:38
【问题描述】:

由于许多单词可能具有相同的长度,因此对某个数据库的插入操作可能会很昂贵。

我看到了以下关于按长度存储和排序单词的建议。哪个效率最高?

  1. Key:单词的长度,Value:具有该长度的所有单词的集合。 使用哈希映射: Sorting all words in a file by length, in one read. (Java)

  2. 使用 Guava 的 MultiMap: https://stackoverflow.com/a/4244798/2653179

  3. 树图?或者将单词存储在 ArrayList 中,编写比较函数,然后使用 Collections.sort: Java: Sort a list of words by length, then by alphabetical order

或其他建议?

【问题讨论】:

  • 这在很大程度上取决于场景。您能否解释一下“由于许多单词可能具有相同的长度,因此对某个数据库的插入操作可能代价高昂”是什么意思?按长度分组单词如何影响数据库插入?
  • trie 是一个选项吗?
  • 按长度排序后,您打算如何处理数据?检索特定单词需要多长时间是否重要,还是只想列出所有长度相同的单词?
  • @AndreyChaschev,插入时单词不按长度分组。插入可以是 O(N)。
  • @nachokk,当然,任何有效的方法都会有所帮助。 :)

标签: java


【解决方案1】:

按长度存储和排序单词的最有效方法?

Map<Integer, List<String>> - 映射,其中键是单词长度,值是单词列表

【讨论】:

  • 这只对写操作有效,时间为O(1)。如果您想查找一个单词是否在数据库中,它是 O(n),其中 n 是单词长度,因此对于长度约为 6 的单词(有很多这样的单词)来说,它可能非常昂贵。但是,如果您只关心写入操作成本,这看起来是最佳选择。
  • @ViktorK。效率不取决于Map和List的实现吗?
  • 谢谢,您会推荐哪种 Map 和 List 实现? HashMap 和 ArrayList?
  • @user2653179 是的。他们应该做这项工作。
  • @JustinKSU 当然是的。我在这里的假设是我们有一个 HashMap 和 LinkedList(或 ArrayList),因为 Adam 专注于写入(存储)效率。这不仅对于存储是最佳的。可能最好的方法是使用 Set 而不是 List
【解决方案2】:

使用 Guava,您可以创建一个包含按长度排序的键的多图:

TreeMultimap<Integer, String> map = TreeMultimap.create();

//as Java's map 
NavigableMap<Integer, Collection<String>> asMap = map.asMap();

添加项目:

for (String word : new String[]{"cd", "efg", "k", "a", "b", "ab"}) {
    map.put(word.length(), word);
}

System.out.println("words: " + map);

打印:

words: {1=[a, b, k], 2=[ab, cd], 3=[efg]}

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2013-09-24
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多