循环的时间复杂性

时间:2016-01-13 14:58:07

标签: c time-complexity complexity-theory

我不确定以下C块的复杂性:

int i = 0, j = 1;
for ( i = 0; i < n * n; i += j )
{
    O1();
    j += 2;
}

其中O1是一个显然需要恒定时间执行的函数。现在,我知道每次迭代计数器增加一个恒定量的循环通常具有O(sqrt(n))的复杂度,但这也是这种情况吗?或者是O(sqrt(n^2)),即O(n)

由于

3 个答案:

答案 0 :(得分:6)

  

我知道每次迭代计数器增加一个常量的循环通常具有O(sqrt(n))的复杂度

那是假的。每次迭代计数器增加一个恒定量的循环是O(N)。

一个循环,其计数器增加的量在每次迭代时线性增加为O(sqrt(N))。

在这种情况下,n * n这里是for(i = 0; i < n; i++) ,因为这是你的循环循环直到,所以简单的替换告诉你,是的,操作是O(sqrt(n ^ 2) )或O(n)。

答案 1 :(得分:3)

  

我知道每次迭代计数器增加一个常量的循环通常具有O(sqrt(n))的复杂度

没有!这不是真的。以此循环为例

i

它的变量1增加了恒定量,即O(n)。但是这个循环的复杂性是i

如果您仔细看到该系列,则0, 3, 8, 15, 24, 35, ... 将获得的值为

0^2 - 1, 1^2 - 1, 2^2 - 1, 3^2 - 1, 4^2 - 1, 5^2 - 1, 6^2 - 1, ...

它是一个算术系列。它也可以写成

i

现在循环将一直运行到n^2到达i < n*n,(O(n)

因此,你可以推断,循环将运行O(n)

因此,复杂性为DROP TABLE A; DROP TABLE B; DROP TABLE C; CREATE TABLE "A" ( "ID_B" NUMBER NOT NULL ); CREATE INDEX "A_INDEX" ON "A"("ID_B"); CREATE TABLE "B" ( "ID" NUMBER NOT NULL, "NAME" VARCHAR2(50 BYTE), "SURNAME" VARCHAR2(50 BYTE), CONSTRAINT "PK_B" PRIMARY KEY ("ID") ); CREATE TABLE "C" ( "ID" NUMBER NOT NULL ); INSERT INTO A(ID_B) VALUES (10); INSERT INTO B(ID, SURNAME, NAME) VALUES(10, 'LUCKY', 'LUKE'); COMMIT;

答案 2 :(得分:1)

它是O(n),因为循环将完全迭代n次。

在互动1上:i的值为1 * 1 - 1 0

在互动2中:i的值为2 * 2 - 1 3

在交互3中:i的值为3 * 3 - 1 8

...

在交互中n:i的值为n * n - 1。这会导致循环终止。

总而言之,i的增长速度足以在n * n - 1次迭代中达到n