我不确定以下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)
?
由于
答案 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
。