【问题标题】:Time complexity of this unique string algorithm这种独特的字符串算法的时间复杂度
【发布时间】:2015-05-20 10:24:48
【问题描述】:

我正在准备面试,遇到了一个问题,您尝试查找字符串是否包含所有唯一字符。

这是我想出的算法。

public static boolean isUniqueChars(String str)
{
    char[] charArray = str.toCharArray();
    Map<Character, Integer> charCounter = new TreeMap<Character, Integer>();

    for (char i : charArray)
    {
        if(charCounter.containsKey(i))
            return false;
        else
            charCounter.put(i,1);
    }
    return true;
}

我看到一个 for 循环,所以它至少是 O(n)。我相信在 hashmap 中的查找也是 O(n)。那么这会使我的算法变成 O(n^2) 吗?

如果它是 O(n^2),那么它比嵌套 for 循环更好,我只是将每个字符与数组的其余部分进行比较。那也是O(n ^ 2)。 谢谢

【问题讨论】:

  • 如果散列结构中的查找是O(n),则绝对没有理由使用它们,因为通过任何集合的线性搜索会找到O(n)中的所有匹配项。

标签: string algorithm hashmap


【解决方案1】:

containsKeytime requirement in TreeMap is O(log n)O(1) in HashMap (for get anyway)。这使您的算法的时间成本为 O(n log n)。由于您不需要地图中的值,因此可以使用 Set,例如HashSet 或 TreeSet,而不是。

如果您不想在找到第一个匹配项之前分配 O(σ) 内存(即字母的大小),那么将每个字符与字符串的其余部分进行比较会更好。

【讨论】:

  • 谢谢,我应该使用 HashSet 来代替。那会使算法成为 O(n) 吗?因为 get 是 O(1)。谢谢
  • 澄清一下:字典(即哈希映射)比搜索树提供更好的find 复杂性,但搜索树维护它们管理的集合的顺序。如果您不需要订单,请使用散列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多