我相信大多数人都知道,如果函数输入大小为n,嵌套循环的复杂度为O(n ^ 2)
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
...
}
}
我认为这是类似的,通过一个类似的论点,但我不确定是否有人可以确认?
for(int i = 0, max = n*n; i < max; i++{
...
}
如果是这样,我猜有些类型的代码,除了递归和子例程之外,其大O映射并不是很明显。
答案 0 :(得分:6)
您的基本简单循环始终为O(m),其中m是迭代的上限。但是你的m实际上是n * n,所以它是O(n ^ 2)。
答案 1 :(得分:2)
取决于“简单”是什么意思。在大小为n的有序数组中进行二分频搜索也可以写为非嵌套for循环,但它会有O(log(n))时间。就像你正确地说的那样,从0到n n的for循环将在O(n n)时间内执行。
是的,有些代码的运行时间不是很明显。更重要的是,那里的代码效果甚至目的也不会立即明显:)
答案 2 :(得分:2)
如果m = n ^ 2,那么“简单的”在m中肯定是线性的。如果您认为这是n ^ 2,请继续。
Big-O表示法计算此处的操作。如果您正在执行其中的n ^ 2,我不确定n ^ 2告诉您的报告总和是什么,因为您正在执行m次操作。
你的建议对我没有意义。这个数字的真实名称有误导性。说出来的正确方法是O(m)。
答案 3 :(得分:1)
它仍然是O(n) - 除了你的“n”在这种情况下是“n * n”。你只是增加了n的值 - 而不是循环的复杂性。