【问题标题】:What Data Structure Can I Use To Hold Elements Of An Array If The Array Elements Start With A String Without Looping Through The Initial Array如果数组元素以字符串开头而不遍历初始数组,我可以使用什么数据结构来保存数组的元素
【发布时间】:2019-08-31 06:53:11
【问题描述】:

我正在尝试实现一个自动完成方法,该方法接收输入字符串并在给定的单词数组中搜索以输入字符串作为数组中单词前缀的单词。

我已经通过遍历单词数组并返回所有带有给定输入字符串前缀的元素成功地实现了这一点。但是,我认为应该有一种最佳方式来执行此操作,因为我意识到在对元素进行排序后循环遍历数组的所有元素。

我只想选择数组中以给定字符串的第一个字母开头的元素,然后在该子数组中搜索以该字符串为前缀的单词。这将大大缩短处理时间并提供最佳解决方案。

我可以使用什么数据结构,不需要我遍历整个给定数组或字典键(我尝试使用映射来实现它),但只选择包含接近解决方案的元素的子数组?

PS:我也玩过 Apache Commons 的 ArrayUtils.subArray() 但无法检索子数组。关于如何实现这一点的任何想法?

【问题讨论】:

标签: java data-structures


【解决方案1】:

您可以使用 TreeSet。填充后,给定一个字符串前缀,您可以通过

获取所有匹配的单词
Set<String> findWords(String prefix) {
    // copied from https://stackoverflow.com/questions/4002021/increment-last-letter-of-a-string
    int len = prefix.length();
    String allButLast = prefix.substring(0, len - 1);
    String endPrefix = allButLast + new Character(prefix.charAt(len - 1) + 1);

    return treeSet.subSet(prefix, endPrefix); 
}

【讨论】:

  • 每个长度为 n 的字符串需要 O(n^2) 空间来存储
  • @mangusta 你为什么这么认为?据我所知,TreeSet 的空间复杂度为 O(n)。
  • @Mangusta 我会对它的来源感兴趣。我的理解是 TreeSet(和 TreeMap)每个节点占用 40 个字节,加上值(例如 java-performance.info/memory-consumption-of-java-data-types-2
  • 啊,我把它和 hashset 搞混了。 treeset 确实在线性时间内查找范围。空间仍然比 trie 差,因为所有的键都按原样存储。 (aba abc abd 与 ab 前缀和 c d 的三个分支)
  • 并且范围搜索将检查树遍历时每个键的前缀,而在 trie 中,前缀仅检查一次,然后检查所有子项。所以基本上基于树集的范围搜索的时间复杂度是 O (n * length (prefix)) 与 O (length (prefix) + number of qualifying strings) in trie
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 2020-10-20
  • 2017-06-16
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多