算法:如何将O(n)和O(nlog(n))求和?


22

我有以下算法,该算法查找重复项并将其删除:

public static int numDuplicatesB(int[] arr) {
    Sort.mergesort(arr);
    int numDups = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i - 1]) {
            numDups++;
} }
    return numDups;
}

我试图找到这种情况下最坏的情况。我知道mergesort是nlog(n),在我的for循环中,我正在遍历整个数据集,因此算作n。我不确定该如何处理这些数字。我应该把它们加在一起吗?如果要这样做,我将如何做?


1
注意:您可以使用哈希表在O(n)中执行此操作,具体取决于内存要求。
corsiKa 2014年

Answers:


67
O(n) + O(n log(n)) = O(n log(n))

对于Big O复杂性,您只关心主导术语。 n log(n)占主导地位,n所以这是您唯一关心的术语。


4
考虑这种情况的另一种方法是,想象您的O(n)处理实际上是O(n log n),就好像您做了两种独立的排序一样。那么您将获得2 * O(n log n)。但是常数变小了,所以您回到O(n log n)。
乔纳森·尤尼斯

4
@Jonathan虽然这在实践中可行,但O(n)等于O(n log(n))是非常正确的,所以我不建议您定期使用它。
阿扎2014年

17
@Emrakul实际上我认为推理在理论上既可行又可行。O(n)是O(n log(n))的适当子集。因此,如果f(n)属于O(n),则它也属于O(n log(n))。
2014年

17
应该注意的是,当我们说的时候f(n) is O(g(n)),我们真正要说的是函数f is a member of the set of functions that grows at the rate of at most g(n) over the long term。这意味着的所有成员O(n)也是的成员O(n*log(n))。该+表达式喜欢O(f(n)) + O(g(n))实际上指的并集(其中的你真的很迂腐,你真的应该使用∪)。
Lie Ryan

3
@LieRyan最初,它不是设置并集,而是设置和:A + B = { a + b | a in A, b in B }。碰巧的是,对于形式上的集合,O(g(n))这与集合并集相同,因为其中一个集合始终是另一个集合的子集,并且它们对总和都是不变的(即A + A = A)。(糟糕,Nate的写法基本相同)。
圣保罗Ebermann

56

让我们推理一下它的方式并记住的定义O。我要使用的是无穷大的极限。

你说明你执行两个操作相应的渐近边界是正确的O(n)O(nlog(n)),但它们组合成一个单一的边界不是那么简单,加入两种功能。您知道您的功能至少要O(n)花费时间,也要花费至少O(nlog(n))时间。所以,真正为你的功能复杂类是工会O(n)O(nlog(n))不过O(nlog(n))是一个超O(n)所以实际上它仅仅是O(nlog(n))


12
+1这应该是答案。它使用compsci术语更精确地描述了答案。

5

如果要长期列出,则大致如下所示:

假设总时间为:a + bn log(n),其中a和b为常数(忽略低阶项)。

当n达到无穷大(an + bn log(n))/ n log(n)-> a / log(n)+ b-> b

因此总时间为O(bn log(n))= O(n log(n))。


2

从O()的定义开始:

O(n log n)表示“如果n大,则小于C n log n”。

O(n)表示“如果n大,则小于D n”。

如果将两者相加,则结果小于C n log n + D n <C n log n + D n log n <(C + D)n log n = O(n log n)。

通常,如果对于大n,f(n)> C g(n),而某些C> 0,则O(f(n))+ O(g(n))= O(f(n))。在使用O()的定义进行了几种情况之后,您将知道可以做什么和不能做什么。


1

大O符号定义为一个集合:

在此处输入图片说明

因此在此处输入图片说明包含所有从任意大点开始在此处输入图片说明始终小于g的函数。

现在,当您有一个正在运行的函数,在此处输入图片说明然后执行另一个比g增长慢的函数时,它肯定比2g增长慢。因此,执行任何比g慢的操作都不会更改复杂度类。

更正式地:

f,h \ in \ mathcal {O}(g)\ Rightarrow(f + h)\ in \ mathcal {O}(g)

您可以轻松证明这一点。

TL; DR

它还是 n log(n)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.