【发布时间】:2014-10-09 21:19:09
【问题描述】:
以下是数组的 orderedInsertion 代码:
public void orderedInsert(int x){
int i =0;
for(i=0;i<count;i++) if(arr[i]>x) break;
for(int j=count-1;j>=i;j--) arr[j+1] = arr[j];
arr[i]=x;
count++;}
如果不是在 IF 语句之后使用 break,我确实实现了第二个 for 循环(带有 j 变量的循环如下: 编辑代码:
public void orderedInsert(int x) {
boolean flag = false;
int i =0;
for (i=0; i<count; i++) {
if (arr[i]>x) {
for (int j=count-1; j>=i; j--) {
arr[j+1] = arr[j];
arr[i] = x;
count++;
flag = true;
}
if (flag)
break;
}
}
}
两种算法都会在 O(N) 中运行吗?这对我来说是有意义的,但我的导师说“如果你看到两个嵌套循环,这意味着它运行 O(N^2)。
对我来说有意义的是,即使在最坏的情况下,我们也只会遍历 N 次。
【问题讨论】:
-
你是对的。在大多数带有嵌套循环的代码中,外循环执行一定次数,而内循环也会执行一定次数每次外循环执行,所以次数为O(N^2) 或 O(M*N)。但是,在这种情况下,您只能到达内部
for一次——而不是每次执行外部循环时都访问一次。因此,您的老师所说的不适用于这种情况。附言你不需要flag——你可以在if里面break。 -
PPS。正确缩进你的代码对于读者(和你的导师)了解发生了什么很有帮助。
-
您在重写方法(第 2 块)中的代码有 2 个左大括号
{,但 3 个右大括号},并带有当前支撑您的if(flag)break;不在循环内,所以什么也不做。 -
我没有注意到——显然代码缺少
{。所以 实际 代码看起来是 O(N^2) (并且可能根本不能正常工作),但 intended 代码应该是 O(N)。 (或者我们应该说实际代码是 O(1),因为它不会编译。)我想我按照您的意思阅读代码,而不是错误地编写代码。 -
我已经更新了 OP 中的代码。这是我没有在 Eclipse 中编写的快速编辑,对此感到抱歉。
标签: java