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

Time complexity 大O符号和根据它测量时间,time-complexity,big-o,Time Complexity,Big O,假设我们有一个O(2^n)阶的算法。此外,假设我们将输入大小n乘以2,那么现在我们有一个大小为2n的输入。时间是如何影响的?我们是不是把这个问题看成,原来的时间是2^n,现在变成了2^(2n),所以答案是新时间是前一时间的2的幂 大0不是告诉您实际运行时间,而是告诉您输入大小对运行时间的影响。如果将输入的大小增加一倍,复杂性仍然是O(2^n),n只是更大 number of elements(n) units of work 1 1

假设我们有一个O(2^n)阶的算法。此外,假设我们将输入大小n乘以2,那么现在我们有一个大小为2n的输入。时间是如何影响的?我们是不是把这个问题看成,原来的时间是2^n,现在变成了2^(2n),所以答案是新时间是前一时间的2的幂

大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
请参阅注释以了解更多解释,但是事实上,,这只是我提出的一个示例,用于帮助您掌握Big-O概念。这是而不是实际的算法含义

假设您有一个数组,
arr=[1,2,3,4,5]

  • O(1)
    操作的一个示例是直接访问索引,例如
    arr[0]
    arr[2]

  • O(n)
    操作的一个例子是一个循环,可以遍历所有数组,例如arr:中元素的

n
将是数组的大小。如果您的数组是原始数组的两倍大,
n
也将是原始数组的两倍大。这就是变量的工作原理


有关补充信息,请参阅。

这里对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
和起始
n0
值,它们都可以显示为小于
M*2^n
。但是很明显,当大小从
n1
增加到
2*n1
时,您注意到的执行时间的变化在它们之间会有很大的差异(在
f4(n)
的情况下根本不会如此)。不能使用Big-O分析来确定对执行时间的影响。它只定义了执行时间的上限(甚至不能保证是上限的最小形式)

以下是一些相关学术界:


该类别中有三个值得注意的边界函数:

O(f(n))
:Big-O-这定义了一个上限

Ω(f(n))
:大ω-这定义了一个下限

Θ(f(n))
:大θ-这定义了一个紧界

一个给定的时间函数
f(n)
Θ(g(n))
只有当它也是
Ω(g(n))
O(g(n))
(即上下界)

您正在处理Big-O,这是讨论的通常“入口点”;我们将完全忽略另外两个

考虑以下定义:

设f和g是定义在实数子集上的两个函数。有人写道:

f(x)=O(g(x))
当x趋于无穷大时

当且仅当存在一个正常数M,使得对于所有足够大的x值,f(x)的绝对值最多为M乘以g(x)的绝对值。也就是说,f(x)=O(g(x))当且仅当存在正实数M和实数x0,使得

| f(x)|x0

从这里开始,假设我们有
f1(n)=2^n
。如果我们将其与
f2(n)=2^(2n)=4^n
进行比较,那么
f1(n)
f2(n)
在大O术语中如何相互关联


这不是
O(1)
O(n)
,或
O(2n)
“意思”。我在给我的答案添加上下文。既然他问了这个问题,人们可能会相信OP并没有理解大O符号的含义。@OlafSzmidt为什么这是一个笑话?如果有错误的陈述,请详细说明并教导/纠正我,而不是随意嘲讽。:)大O表示“不差于”,小O表示“不优于”,θ表示“不差于且不优于”。但请记住,时间复杂性大约是一个数量级。我知道大O表示最坏的情况,小O表示最好的情况。但是,在我的示例中,我明确地说,
假设问题声明中有
,而
O(…)**的意思是**
。如果我是对的,那就称之为类比,它对理解更抽象的概念有很大帮助。:)我的意思是运行时间是如何受到影响的,它是双倍还是三倍…?比双倍或三倍更糟糕,它可能以2倍的速度增长^n@EamonnMcEvoy值得注意的是,它也可能根本不会生长。Big-O不指定紧边界;只有函数是它的上界。例如:
f(n)=100
将是
O(2^n)
(它也是
O(1)
)。谢谢你的回答。我的问题是关于O(2^n)阶的同一个算法(因此不是f1(n)和f2(n),而是只有f1(n)),我问如果该算法运行大小为2n的输入所需的时间,如果它在t秒内运行大小为n的输入,会发生什么。那么,新输入t^2所需的时间是多少?所需的时间无法通过Big-O分析来定义;
O(2^n)
中的某些项可以有几个影响指数项之外的执行时间的其他项(甚至不能保证有指数项)。看看
f4(n)
(即
O(2^n)
);如果您从
n=4
加倍到
n=8
,那么
f4(n)
会发生什么变化?更改为0。对f2(n)
进行相同的分析,变化量为120000。两个完全不同的答案,尽管都是'O(2^n);Big-O分析完全没有告诉你n的变化是如何影响执行时间的。不用担心,很高兴它有帮助!如果这个答案对你有帮助,我会告诉你的