Algorithm logn复杂度循环是什么样子的?

Algorithm logn复杂度循环是什么样子的?,algorithm,data-structures,time-complexity,asymptotic-complexity,Algorithm,Data Structures,Time Complexity,Asymptotic Complexity,我这里有几个问题 考虑下面的循环(n=8) for(inti=1;i该循环看起来不像O(logn)。它是一个O(N/2)循环。引用定义: 函数f(x)被称为O(g(x))iff(当且仅当)存在一个正实数c和一个实数x0使得| f(x)|=x0。例如,你也可以调用循环O(N),O(N^2),O(N^3),因为你可以很容易地找到所需的参数。但是,你无法找到使O(logn)适合的参数 至于O(loglogn),我想您可以重写这里给出的插值搜索实现,以使用for循环。它平均是O(logn)!该循环看起来

我这里有几个问题 考虑下面的循环(n=8)


for(inti=1;i该循环看起来不像O(logn)。它是一个O(N/2)循环。引用定义:

函数f(x)被称为O(g(x))iff(当且仅当)存在一个正实数c和一个实数x0使得| f(x)|=x0。例如,你也可以调用循环O(N),O(N^2),O(N^3),因为你可以很容易地找到所需的参数。但是,你无法找到使O(logn)适合的参数


至于O(loglogn),我想您可以重写这里给出的插值搜索实现,以使用for循环。它平均是O(logn)!

该循环看起来不像O(logn)。它是一个O(N/2)循环。引用定义:

函数f(x)被称为O(g(x))iff(当且仅当)存在一个正实数c和一个实数x0使得| f(x)|=x0。例如,你也可以调用循环O(N),O(N^2),O(N^3),因为你可以很容易地找到所需的参数。但是,你无法找到使O(logn)适合的参数

至于O(loglogn),我想您可以重写这里给出的插值搜索实现来使用for循环。它平均是O(loglogn)!

O(logn)
循环:

for (i = 1; i <= n; i *= 2)
注意:您的循环是
O(n)
,而不是
O(logn)
。按照上面的
增量/双精度/指数化
思想,您可以使用增量重写循环:

for(int i = 1; i < n; i += 2)
for(int i=1;i
即使增加更多,它仍然是增加的,并且仍然
O(n)
O(logn)
循环:

for (i = 1; i <= n; i *= 2)
注意:您的循环是
O(n)
,而不是
O(logn)
。按照上面的
增量/双精度/指数化
思想,您可以使用增量重写循环:

for(int i = 1; i < n; i += 2)
for(int i=1;i
即使你增加了更多,它仍然是增加的,并且仍然
O(n)
你的成本不是O(logN),你的成本是O(n*logN)

阅读本手册,您将看到一个函数示例,如:

无论多项式的起始数是多少,多项式的代价都是最大的

在你的情况下是这样的

1/2*n*log(n),1/2没有区别,你的复杂性是O(n*logN)

你的成本不是O(logN),你的成本是O(n*logN)

阅读本手册,您将看到一个函数示例,如:

无论多项式的起始数是多少,多项式的代价都是最大的

在你的情况下是这样的


1/2*n*log(n),1/2没有区别你的复杂度是O(n*logN)

你在哪里看到上面的循环是O(logN)?不是。这是他们在大学里教的。循环0到n的复杂度将是O(n),k个0到n复杂度的嵌套循环将是O(n^k)。你在哪里看到上面的循环是O(logN)不是。这是他们在大学里教的。0到N复杂度的循环将是O(N),k复杂度为0到N的嵌套循环将是O(N^k)。你的答案太优雅了。@Piecuckherr
i*=2
意味着
i
在循环的每次迭代后都会加倍。
N/2
意味着你总是使用
N
的一半在你的情况下永远不会改变它的值。以
N=64
为例。你将迭代
i=1、2、3、4、5、6、7、。..,64/2=32
。我的例子将迭代
i=1,2,4,8,16,32,64
。注意区别吗?你的答案太优雅了。@piechuckerr
i*=2
意味着
i
在循环的每次迭代后都会加倍。
N/code>意味着你总是使用
N
N
的一半进行工作,永远不会改变以
n=64
为例,您将迭代
i=1,2,3,4,5,6,7,…,64/2=32
。我的示例将迭代
i=1,2,4,8,16,32,64
。注意到区别了吗?