大O复杂性是否可以有多个答案?

时间:2019-02-25 12:11:50

标签: algorithm big-o analysis

您将如何从大O复杂度谈起以下功能?

for (int i = 0; i < n; i++) {
  for (int j = 0; j < n && j < 10; j++) {
    //do something in constant time
  }
}

在这种情况下,我会看到最坏的情况是O(n),我可以放心地忽略小于10的值是O(n ^ 2)的事实,因为它与“最差”情况相去甚远。

获得更真实的体验。让我们谈谈查找两个字符串是否彼此置换的大小复杂性。简单的方法是为所有字符值(ascii字符为128)获取一个整数数组。

现在,如果您切换到向量或哈希图(我想说的只是使用整数数组,但有人使用的示例是哈希图),则输入的变量大小最多为128个字符。

我们正在讨论大小复杂性,我只是说它是O(1)只是因为在最坏的情况下您会得到128。另一个人自信地说这是O(n),最多128个字符,并变成了O(1)的极限。我们没有确切的答案。

在处理Big O时,我从未听说过使用“限制”。那么在这种情况下哪个是正确的?我是否正确,因为仅当n为“足够大”时才考虑判断大O时的正确复杂性?还是在其他情况下还有其他答案?

2 个答案:

答案 0 :(得分:3)

  

答案不止一个吗?

是的,大的O表示形式表示“较小或相等”,因此,如果您的努力在O(n)中,它也在O(n log n)或O(n ^ 2)中。但是,通常人们会对紧的边界感兴趣。

  

让我们谈谈两个字符串是否彼此置换的大小复杂性

字符串中可能的字符集是有限的,因此大小复杂度为O(1)。根据我之前所说的,它也在O(n)中。但更严格的界限是O(1)。

答案 1 :(得分:0)

您的帖子中有几个问题。而且,它们并不是真正的编程问题。我会尝试一个有用的答案:

该循环同时位于O(n)O(n^2)中(请阅读有关Big-Oh的定义,例如Wikipedia)。如果需要,循环也可以是O(n^3)O(n^4)。但是我们的想法是找到可能的“最低” O(f(n)),在您的情况下为O(n),更精确的说O(10*n),这是相同的设置确实是O(n)

算法的增长顺序(或复杂度,如果需要的话)是其输入大小的函数。因此,在您的情况下,两个字符串是否彼此置换?,这取决于字符串的大小。假设最小字符串的大小为n,并且您必须读取决策问题的整个输入,那么您至少要执行n个步骤(这很明显它不能为{{1 }}。

哈希映射数组的有限大小是算法内存的增长顺序(空间复杂度),如果仅使用ASCII集,那么我也可以看到它也是O(1)