Time complexity O(n)和O(logn)的乘积是什么?

Time complexity O(n)和O(logn)的乘积是什么?,time-complexity,big-o,mergesort,Time Complexity,Big O,Mergesort,在学习合并排序算法时,发现合并排序的时间复杂度为O(nlogn) 想知道我们是否可以说O(n logn)=O(n)*O(logn)?不,这样做真的没有意义。Big-O函数产生函数集,而函数集不能相乘 更一般地说,您通常不会对O(…)结果执行任何操作。没有加法,减法,乘法。没有代数。O(…)通常在一个证明的结论:“基于上面的分析,我得出结论,Fink算法的最坏情况复杂度是O(无论什么)。”它并没有真正出现在它可能会受到代数操作的中间。 (我想你可以执行集合运算。我从来没有见过有人这样做。)实际上,

在学习合并排序算法时,发现合并排序的时间复杂度为
O(nlogn)


想知道我们是否可以说
O(n logn)
=O(n)*O(logn)?

不,这样做真的没有意义。Big-O函数产生函数集,而函数集不能相乘

更一般地说,您通常不会对O(…)结果执行任何操作。没有加法,减法,乘法。没有代数。O(…)通常在一个证明的结论:“基于上面的分析,我得出结论,Fink算法的最坏情况复杂度是O(无论什么)。”它并没有真正出现在它可能会受到代数操作的中间。
(我想你可以执行集合运算。我从来没有见过有人这样做。)

实际上,Big-o的定义是不可交换的,让我们看一个例子:

设f定义为f(n)=n

f(n)=O(n^2)&f(n)=O(n^3),但是O(n^2)!=O(n^3)

这是因为在这里使用等号不能准确地定义f(n)
is
O(g)

无论如何,有点不准确,以下是sipser对Big-O的定义:

假设f(n)=O(g(n))
如果存在正整数c和n0,则对于每个整数n≥ 不, f(n)≤ CG(n)。
当f(n)=O(g(n))时,我们说g(n)是 当f(n)=O(g(n))时,我们说g(n)是 f(n),或者更精确地说,g(n)是 f(n),强调我们正在抑制常数因子

因此,为了证明你所说的,你必须首先定义等式中
*
的含义。并显示每个函数为O(n logn),它也是O(n)*O(logn),反之亦然

但由于再次不准确,将*定义为符号多项式乘法,我们对一些常数正c和d有如下结果

O(n log n)=O(cn log n)=O(log n^(cn))=O(d log n^(cn))=O(log(n^cn)^d)=O(log n^cdn)~=log n^cdn~=cdn*log n


=O(n)*O(logn)=O(cn)*O(dlogn)=O(cn)*O(logn^d)~=cn*(logn^d)~=cn*d*logn~=cdn*logn

要正式说明做什么
O(n)*O(logn)
,让我们做以下定义:

函数
f
位于
O(n)*O(logn)
当且仅当它可以作为产品
f(n)=g(n)h(n)
写入,其中
g
位于
O(n)
h
位于
O(logn)

现在我们可以证明集合
O(n)*O(logn)
等于集合
O(nlogn)
,方法是证明两个集合中的函数相同:

  • 给定
    g
    O(n)
    h
    O(logn)
    中,有
    ng
    g
    nh
    h
    ,这样对于所有
    n>=max(nĒg,nĒh)
    我们都有
    g(n)
    1g(n)是为了避免在
    n
    为零时被零除