Algorithm 对于大O复杂性,是否有不止一个答案?
您如何从大O复杂性的角度来讨论以下函数Algorithm 对于大O复杂性,是否有不止一个答案?,algorithm,big-o,analysis,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 } } for(int i=0;i
for (int i = 0; i < n; i++) {
for (int j = 0; j < n && j < 10; j++) {
//do something in constant time
}
}
for(int i=0;i
在这种情况下,我会看到最坏的情况是O(n),我可以安全地忽略值小于10的情况是O(n^2),因为它远离“最坏”情况
为了更真实的体验。让我们讨论一下查找两个字符串是否是彼此的置换的大小复杂性。实现这一点的简单方法是对所有字符值(ascii字符为128)采用整数数组
现在,如果您切换到向量或hashmap(我会说只使用整数数组,但有人使用的示例是hashmap),您可以输入多达128个字符的可变大小
我们讨论了尺寸的复杂性,我只是说它是O(1),因为在最坏的情况下,你会得到128。另一个人自信地说,它是O(n),最多128个字符,并且成为O(1)的限制。我们没有一个明确的答案
我从来没有听说过在处理大O时使用“限制”。那么在这种情况下哪个是正确的呢?判断大O的正确复杂性只有在n“足够大”时才被考虑,这是对的吗?或者,在其他情况下,是否有其他答案?您的帖子中有几个问题。而且,它们不是真正的编程问题。我将尝试一个有用的答案: 循环既在
O(n)
中,也在O(n^2)
中(请阅读关于Big Oh的定义,例如维基百科)。如果需要,循环也可以是O(n^3)
或O(n^4)
。但是,我们的想法是找到可能的“最低的”O(f(n))
,在您的例子中是O(n)
,更准确地说是O(10*n)
,它实际上与O(n)
相同
算法的增长顺序(或者复杂度,如果你愿意)是其输入大小的函数。那么在你的例子中,两个字符串是相互排列的吗?这取决于字符串的大小。假设最小字符串的大小为n
,并且您必须读取决策问题的整个输入,您至少有n
步骤(这表明它不能是O(1)
)
哈希映射数组的有限大小是算法内存的增长顺序(空间复杂度),如果只使用ASCII集,那么我可以看到它也是O(1)
答案可以不止一个吗
是的,大O表示法表示“更小或相等”,所以如果你的努力是在O(n)中,它也在O(n logn)或O(n^2)中。然而,人们通常对紧束缚感兴趣
让我们讨论一下,如果两个字符串是彼此的排列,那么查找它们的大小复杂性
字符串中可能的字符集是有限的,因此大小复杂度为O(1)。根据我之前所说的,它也在O(n)中;但是更紧的界限是O(1)。可能的复制IMHO的内环只是O(1)。同样地,对于像for(inti=0;i<(n<1000?pow(10,n):10);i++)这样的循环也是如此,它的迭代次数从不超过10^1000次……OP询问的是检测置换的空间复杂度,而不是时间复杂度。不确定我是否理解了注释,我感到相当困惑。最后一句不是关于空间复杂性吗?第三段不是关于时间复杂性吗?我现在明白你的意思了。我使用了算法的内存而不是空间复杂度。我的措辞可能很不幸。我希望通过这一评论,它现在更清楚了。为了补充答案,有时编码大小的描述会有所不同。矩阵乘法算法的运行时复杂性通常在
n
中说明,而输入的大小为n*n
,这可能会造成混淆。更具体地说,使用该定义的简单矩阵乘法将产生O(n^3)
,但这意味着运行时间是n
中的立方,而不是输入的大小,即n*n
。因此,在输入大小中,运行时间将是O(n^1.5)
。