我正在查看方法实现的时间复杂度,该方法确定String
是否包含所有唯一字符。
基本的强力方法是一次迭代String
一个字符,保持{em}看到字符HashSet
。对于迭代中的每个字符,我们检查Set
是否已包含它,如果是,则返回false
。如果搜索了整个true
,我们会返回String
。这将是O(n)
作为最坏情况的复杂性。平均情况是什么? O(n/2)
?
如果我们尝试通过将String
排序到char
数组来优化此功能,那么效率会更高还是更低?排序通常需要O(n log n)
,这比O(n)
更差,但排序String
允许更早检测到重复字符(特别是对于长字符串)。
我们说最坏的情况是O(n^2 log n)
,但平均情况更好吗?如果是这样,它是什么?
答案 0 :(得分:1)
在未排序的情况下,平均情况完全取决于字符串!在不知道/假设任何分布的情况下,很难做出任何假设。
一个简单的例子,对于一个随机放置字符的字符串,其中一个字符重复一次:
n*(n-1)/2
k
步骤完成重复的概率为(k-1)/(n-1)
k
步中检测到的概率为(k*(k-1))/(n*(n-1))
,这意味着您平均会在大约n
中检测到它(对于大0.7071*n
}。 [不完整] 对于以不同频率出现的多个字符,或者您对字符串中字符的分布方式做出不同的假设,您将得到不同的概率。
希望有人可以延伸我的答案! :)
如果字符串已排序,则您不需要HashSet。
但是,平均情况仍取决于字符串中字符的分布:如果在开始时得到两个aa
,则效率非常高;如果你得到两个zz
,那么你没有赢得任何东西。
最糟糕的情况是排序加检测重复项,因此O(n log n + n)
或仅O(n log n)
。
因此,由于平均情况和最坏情况下的复杂性增加,预计对字符串进行排序似乎是不利的。