初始化非零时如何计算for循环的原始比较操作?
How to count primitive comparison operations of for loop when initialization is non-zero?
for循环如下:
for(i = 0; i < n; i++){
}
初始化算1次操作,条件测试执行n+1次,递增n次。这给出了 T(n) = 1 + n + 1 + n = 2n + 2。我明白这一点。我感到困惑的地方是我被分配了一个非零值。我假设当 i = 1 时比较只发生 n 次并导致 T(n) = 1 + n + n = 2n + 1?但是如果我被分配到 10 会发生什么?还是负值?比较次数还是n还是n+1?
让我们用 i0
的初始化替换 0 的初始化,使整个事情更通用。
所以伪代码如下所示:
i0 = 0;
for (i = i0; i < n; i++) { }
现在我们可以更一般地表述公式:
T(n) = T_init(n) + T_cmp(n) + T_inc(n)
= 1 + (n-i0+1) + (n - i0)
= 2*(n - i0 + 1)
= 2*n - 2*i0 + 2
T_init
应该清楚了。正如你所说,初始化总是 运行 只有一次,与 n.
无关
比较始终 运行 直接在增量之后,但也在第一次循环迭代之前进行一次。所以 T_cmp(n) = T_inc(n) + 1
.
您也可以尝试使用一些辅助函数:
function init() {
print("init");
return i0;
}
function cmp(i,n) {
print("cmp");
return i < n;
}
function inc(i) {
print("inc");
return i+1;
}
for (i = init(); cmp(i,n); i = inc(i)) { }
这应该为每个操作打印一行,这样您就可以计算行数来测量“时间”。 (好吧,这是伪代码,所以你必须适应你的语言才能 运行 :)
for循环如下:
for(i = 0; i < n; i++){
}
初始化算1次操作,条件测试执行n+1次,递增n次。这给出了 T(n) = 1 + n + 1 + n = 2n + 2。我明白这一点。我感到困惑的地方是我被分配了一个非零值。我假设当 i = 1 时比较只发生 n 次并导致 T(n) = 1 + n + n = 2n + 1?但是如果我被分配到 10 会发生什么?还是负值?比较次数还是n还是n+1?
让我们用 i0
的初始化替换 0 的初始化,使整个事情更通用。
所以伪代码如下所示:
i0 = 0;
for (i = i0; i < n; i++) { }
现在我们可以更一般地表述公式:
T(n) = T_init(n) + T_cmp(n) + T_inc(n)
= 1 + (n-i0+1) + (n - i0)
= 2*(n - i0 + 1)
= 2*n - 2*i0 + 2
T_init
应该清楚了。正如你所说,初始化总是 运行 只有一次,与 n.
比较始终 运行 直接在增量之后,但也在第一次循环迭代之前进行一次。所以 T_cmp(n) = T_inc(n) + 1
.
您也可以尝试使用一些辅助函数:
function init() {
print("init");
return i0;
}
function cmp(i,n) {
print("cmp");
return i < n;
}
function inc(i) {
print("inc");
return i+1;
}
for (i = init(); cmp(i,n); i = inc(i)) { }
这应该为每个操作打印一行,这样您就可以计算行数来测量“时间”。 (好吧,这是伪代码,所以你必须适应你的语言才能 运行 :)