Algorithm logn复杂度循环是什么样子的?
我这里有几个问题 考虑下面的循环(n=8)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)!该循环看起来
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)。你的答案太优雅了。@Piecuckherri*=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
。注意区别吗?你的答案太优雅了。@piechuckerri*=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
。注意到区别了吗?