Algoritmalar: O (n) ve O (nlog (n)) 'yi birlikte nasıl toplarım?


22

Yinelenenleri bulur ve bunları kaldırır takip algoritması var:

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;
}

Bunun en kötü durum zaman karmaşıklığını bulmaya çalışıyorum. Mergesort'un olduğunu biliyorum nlog(n)ve benim for döngümde, veri kümesinin tamamını yineleyerek sayın n. Yine de bu rakamlarla ne yapacağımdan emin değilim. Onları bir araya toplayayım mı? Bunu yapacak olsaydım nasıl yapardım?


1
Yan not: Bellek gereksinimlerine bağlı olarak bunu O (n) 'de yapmak için bir karma tablosu kullanabilirsiniz.
corsiKa

Yanıtlar:


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

Büyük O karmaşıklığı için tek umursadığınız baskın terimdir. n log(n)hakim nolduğu için önemsediğiniz tek terim budur.


4
Bunu düşünmenin bir diğer yolu, O (n) işleminizin, iki bağımsız tür yapmışsınız gibi gerçekten O (n log n) olduğunu hayal etmektir. O zaman 2 * O (n log n) olur. Ancak sabitler aşağı doğru kayıyor, o yüzden geri döndünüz (n log n).
Jonathan Eunice,

4
@Jonathan Bu pratikte çalışırken, O (n) 'in O (n log (n))' ye eşit olmadığı çok doğru , bu yüzden bunu düzenli olarak kullanmanızı tavsiye etmem.
Aza

17
@Emrakul aslında akıl yürütmenin teorik olarak pratik olduğu kadar sağlam olduğunu da düşünüyorum. O (n), O (n log (n)) 'nin uygun bir alt kümesidir. Yani eğer f (n) O (n) 'ya aitse, O (n log (n))' a da aittir.
emory

17
f(n) is O(g(n))Gerçekten dediğimizi söylediğimizde fonksiyonun bu olduğu not edilmelidir f is a member of the set of functions that grows at the rate of at most g(n) over the long term. Bu, tüm üyelerin O(n)de üyesi olduğu anlamına gelir O(n*log(n)). +İfadelerde severim O(f(n)) + O(g(n))aslında set birliği (gerçekten bilgiçlik konum arasında, gerçekten kullanması gereken hangi ∪) bakın.
Lie Ryan

3
Başlangıçta, bu sendikayı ayarlanır, ancak set toplamı değildir @LieRyan: A + B = { a + b | a in A, b in B }. Form kümeleri için O(g(n))bunun set birliği ile aynı olduğu, setlerden birinin daima diğerinin bir alt kümesi olduğu ve her ikisinin de toplamların değişmez olduğu anlamına gelir (yani A + A = A). (Hata! Nate aynı şekilde yazdı).
Paŭlo Ebermann

56

Bunun için bizim yolumuza bakalım ve tanımını hatırlayalım O. Kullanacağım kişi sonsuzluğun sınırı için.

Karşılık gelen asimptotik sınırlarla iki işlem yaptığınızı O(n)ve O(nlog(n))bunların tek bir sınırda birleştirilmesinin iki işlevi eklemek kadar basit olmadığını belirtmekte haklısınız. İşlevinizin en az O(n)zaman aldığını ve en az zaman aldığını da biliyorsunuz O(nlog(n)). Yani gerçekten fonksiyon için karmaşıklık sınıf birliği olduğunu O(n)ve O(nlog(n))ancak O(nlog(n))bir üst kümesidir O(n)sadece bu yüzden gerçekten O(nlog(n)).


12
+1 bu cevap olmalı. Compsci terimlerini kullanarak cevabı daha kesin olarak açıklar.

5

Uzun bir süre açık bırakacak olursanız, kabaca şöyle görünürdü:

Toplam sürenin aşağıdaki gibi olduğunu varsayalım: a + b'nin sabit olduğu bir + bn günlüğü (n) (daha düşük dereceli terimleri yok sayarak).

N sonsuzluğa giderken (an + bn günlüğü (n)) / n günlüğü (n) -> a / günlüğü (n) + b -> b

Böylece toplam süre O (bn log (n)) = O (n log (n)) olur.


2

O () tanımı ile başlayın:

O (n log n), "n büyükse Cn log n'den az" anlamına gelir.

O (n) "n büyükse Dn'den az" anlamına gelir.

Her ikisini de eklerseniz, sonuç Cn log n + D n <C n log n + D n log n <(C + D) n log n = O (n log n) değerinden düşüktür.

Genel olarak, eğer f (n)> C büyük (n) ve bazı C> 0 için g (n), o zaman O (f (n)) + O (g (n)) = O (f (n)). Ve O () tanımını kullanarak birkaç vaka yaptıktan sonra, ne yapabileceğinizi ve yapamayacağınızı bileceksiniz.


1

Büyük O notasyonu set olarak tanımlanır:

görüntü tanımını buraya girin

Yani görüntü tanımını buraya girintüm fonksiyonlar - keyfi bir büyük noktadan başlayarak görüntü tanımını buraya girin- her zaman g'den küçük olan tüm fonksiyonları içerir .

Şimdi, içinde olan bir işleve sahip olduğunuzda görüntü tanımını buraya girinve sonra g'den daha yavaş artan başka bir işlevi yerine getirdiğinizde, kesinlikle 2g'den yavaşlar. Dolayısıyla, g'den daha yavaş bir şey yürütmek karmaşıklık sınıfını değiştirmez.

Daha resmi:

f, h \ in \ mathcal {O} (g) \ Sağ Ok (f + h) \ in \ mathcal {O} (g)

Bunu kolayca kanıtlayabilirsiniz.

TL; DR

O hala n günlüğü (n)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.