大O符号和根据它测量时间

时间:2018-01-31 12:14:37

标签: time-complexity big-o

假设我们有一个O(2 ^ n)阶的算法。此外,假设我们将输入大小n乘以2,所以现在我们有一个大小为2n的输入。时间受影响了吗?我们看问题好像原始时间是2 ^ n现在​​它变成2 ^(2n)所以答案是新时间是前一次2的幂?

3 个答案:

答案 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^nM值是n0吗?当然!使用M = 1n0 = 1,这是事实。因此,2^n 上限为O(4^n)

对于某些4^n <= M * 2^nM值是n0吗?这就是你遇到问题的地方......因为M没有恒定的价值,你可以使2^n4^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