假设我们有一个O(2 ^ n)阶的算法。此外,假设我们将输入大小n乘以2,所以现在我们有一个大小为2n的输入。时间受影响了吗?我们看问题好像原始时间是2 ^ n现在它变成2 ^(2n)所以答案是新时间是前一次2的幂?
答案 0 :(得分:4)
Big 0不是告诉你实际的运行时间,而是告诉您输入的大小如何影响运行时间。如果你输入的大小加倍,复杂性仍然是O(2 ^ n),n就更大了。
number of elements(n) units of work
1 1
2 4
3 8
4 16
5 32
... ...
10 1024
20 1048576
答案 1 :(得分:0)
这里有一个关于Big-O如何与执行时间相关的误解。
考虑以下定义执行时间的公式:
f1(n) = 2^n + 5000n^2 + 12300
f2(n) = (500 * 2^n) + 6
f3(n) = 500n^2 + 25000n + 456000
f4(n) = 400000000
这些功能中的每一个都是O(2^n)
;也就是说,对于任意M * 2^n
和起始M
值,它们每个都可以显示为小于n0
。但很明显,您注意到将大小从n1
加倍到2 * n1
的执行时间的变化在它们之间会有很大差异(在f4(n)
的情况下根本不是这样)。您无法使用Big-O分析来确定对执行时间的影响。它只定义执行时间的上限(甚至不保证是上限的最小形式)。
以下一些相关学术界:
此类别中有三个值得注意的边界函数:
O(f(n))
:Big-O - 这定义了一个上限。
Ω(f(n))
:Big-Omega - 这定义了一个下限。
Θ(f(n))
:Big-Theta - 这定义了一个紧束缚。
给定时间函数f(n)
仅在Θ(g(n))
和Ω(g(n))
(即上限和下限)的情况下才为O(g(n))
。
你正在处理Big-O,这是通常的#34;切入点"讨论;我们将完全忽略其他两个。
考虑Wikipedia的定义:
设f和g是在实数的某个子集上定义的两个函数。一个人写道:
f(x)=O(g(x))
因为x趋于无穷大当且仅当存在正常数M使得对于所有足够大的x值,f(x)的绝对值最多为M乘以g(x)的绝对值。也就是说,f(x)= O(g(x))当且仅当存在正实数M和实数x0时
所有x>
|f(x)| <= M|g(x)|
X0
从这里开始,假设我们有f1(n) = 2^n
。如果我们将其与f2(n) = 2^(2n) = 4^n
进行比较,那么{O}项中f1(n)
和f2(n)
将如何相互关联?
对于某些2^n <= M * 4^n
和M
值是n0
吗?当然!使用M = 1
和n0 = 1
,这是事实。因此,2^n
上限为O(4^n)
。
对于某些4^n <= M * 2^n
和M
值是n0
吗?这就是你遇到问题的地方......因为M
没有恒定的价值,你可以使2^n
比4^n
增长得更快,因为n
变得任意大。因此,4^n
不是上限为O(2^n)
。
答案 2 :(得分:-2)
请参阅评论以获取进一步的解释,但确实,这只是我想出的一个帮助您掌握Big-O概念的示例。那是不实际的算法含义。
假设您有一个数组arr = [1, 2, 3, 4, 5]
。
O(1)
操作的一个示例是直接访问索引,例如arr[0]
或arr[2]
。
O(n)
操作的一个示例是可以遍历所有数组的循环,例如for elem in arr:
。
n
将是您的数组的大小。如果你的数组是原始数组的两倍,n
也将是原来数组的两倍。这就是变量的工作方式。
有关补充信息,请参阅Big-O Cheat Sheet。