我是算法分析领域的新手。我在Stack Overflow问题中读到这里
“What is a plain English explanation of "Big O" notation?”O(2n^2)
和O(100 n^2)
与O(n^2)
相同。我不明白这一点,因为如果我们采用n = 4,操作次数将为:
O(2 n^2)
= 32次操作O(100 n^2)
= 1600次操作O(n^2)
= 16次操作任何人都可以解释为什么我们应该将这些不同的操作计数视为等效吗?
答案 0 :(得分:9)
为什么这是真的可以直接从the formal definition导出。更具体地说,f(x) = O(g(n))
当且仅当|f(x)| <= M|g(x)| for all x >= x0
用于某些M
和x0
。在这里,您可以根据需要随意选择M
,因此如果M = 5
f(x) = O(n2)
为真,那么您只需选择M = 5*100
f(x) = O(100 n2)
即可是的。
为什么这很有用是一个不同的故事。
关于使常数很重要的一些问题:
Big-O(渐近复杂度的一部分)避免了所有这些问题。您只需检查执行一段时间(即独立于输入大小)的某段代码的次数。例如:
c = 0
for i = 1 to n
for j = 1 to n
for k = 1 to n
x = input[i]*input[j]
y = input[j]*input[k]
z = input[i]*input[k]
c += (x-y)*z
所以有4次乘法,1次减法和1次加法,每次执行n 3 次,但这里我们只说这段代码:
x = input[i]*input[j]
y = input[j]*input[k]
z = input[i]*input[k]
c += (x-y)*z
以恒定时间运行(无论数组中有多少元素,它总是需要相同的时间)并且将执行O(n3)
次,因此运行时间为O(n3)
答案 1 :(得分:3)
因为O(f(n))
表示所述函数以某种常数次f(n)
为。如果g
受100 f(n)
的多个限制,则它也会被f(n)
的倍数包围。具体来说,O(2 n^2)
并不意味着n = 4
不超过16,但对于所有 n
而言,对于某些已修复的<{1}}并不大于C * 2n^2
C
,独立于n
。
答案 2 :(得分:1)
因为它是一个分类,所以它将算法放在一些复杂性类中。类是O(1),O(n),O(n log n),O(n ^ 2),O(n ^ 3),O(n ^ n)等。根据定义,两个算法在当n变为无穷大时,如果差值是一个常数因子,那么相同的复杂度类别(大的符号用于比较大的n值的算法复杂度)。