【问题标题】:Java-Hashset-checking whether a given string is substring of some elementJava-Hashset-检查给定字符串是否是某个元素的子字符串
【发布时间】:2014-05-01 03:16:09
【问题描述】:

我在 Java 的 hashset 中存储了几个元素,假设“hello world”、“small大象”、“hellostack”、“others”。现在,我有字符串假设“hello”,我想检查它是否是给定哈希集中任何元素的子字符串。这里是“helloworld”和“hellostack”的子串。

优势:我已经知道了,没有像“stackhello”或“world hello”这样的字符串。我的意思是,无论我想比较什么字符串,我已经知道 它总是在前缀中,而不是在哈希集中元素的中间或后缀中。

注意:我不是要求遍历整个哈希集来检查它!!​​!! 我需要一种有效的方法,比如我可以在 O(n) 时间内检查它

如果不可能,请提出一种有效的方法(可能在 O(n) 复杂度中),而不使用 hashset。

【问题讨论】:

  • 你想检查每个元素而不检查每个元素?
  • 你更喜欢哪一个,检查每个元素,还是使用不同的数据结构?不同的数据结构可以代替或补充 HashSet。

标签: java string substring complexity-theory hashset


【解决方案1】:

我不知道我是否理解正确。似乎您正在尝试搜索具有子字符串的单词。

我相信您正在寻找的是后缀树。有了它,您可以使用集合中任何单词的子字符串搜索匹配的单词。

算法的描述在这里: http://en.wikipedia.org/wiki/Generalised_suffix_tree

还有一个在 Java 中看起来不错的实现:https://github.com/abahgat/suffixtree

我希望它能把你推向正确的方向。

【讨论】:

  • 这实际上是 OP 想要的相反。一个普通的trie 将是要走的路。
【解决方案2】:

我不是要求遍历整个哈希集来检查它!!​​!!

那你问的是不可能的事。使用HashSet,您需要遍历集合并与每个String 进行比较。

如果您的主要用例是查看提供的前缀是否与数据结构中的单词匹配,那么 Trie 实际上就是您想要的,并在实现中添加了提供该功能的方法(注意 Java 确实不包括在 JDK 中的 Trie 实现,但实现起来相当简单和/或您可以在“网络”上找到实现)。

确定是否存在与提供的前缀匹配的现有单词是两者中的线性 (O(n)) 函数。

使用HashSet 你有一个外循环(通过HashSet 的迭代)和一个独立的内循环(String 比较)。这是O(N*M),它被简化为O(n)

对于 Trie,它仍然是线性的,但 n 的大小更小,因为它是基于输入(前缀)String 大小的结构的单次遍历。

区别在于词本身的插入性能; Trie 是 O(n) 与 HashSet 是 O(1)

【讨论】:

    猜你喜欢
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2019-05-11
    • 2011-02-07
    • 2011-07-05
    • 1970-01-01
    相关资源
    最近更新 更多