平均案例大O和排序的影响

时间:2017-09-04 14:35:03

标签: string algorithm sorting big-o

我正在查看方法实现的时间复杂度,该方法确定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),但平均情况更好吗?如果是这样,它是什么?

1 个答案:

答案 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)

因此,由于平均情况和最坏情况下的复杂性增加,预计对字符串进行排序似乎是不利的。