Bu algoritmaları analiz etmek istiyorsanız sonucu tanımlayabilmeniz için // dostuff'ı tanımlamanız gerekir. Diyelim ki dostuff, sürekli O (1) sayıda işlem gerektiriyor.
İşte bu yeni gösterimde bazı örnekler:
İlk örneğiniz için, doğrusal geçiş: bu doğru!
O (N):
for (int i = 0; i < myArray.length; i++) {
myArray[i] += 1;
}
Neden doğrusal (O (n))? Girdiye (dizi) ek elemanlar ekledikçe, gerçekleşen işlemlerin sayısı, eklediğimiz elemanların sayısıyla orantılı olarak artar.
Bu nedenle, bellekte bir tamsayıyı arttırmak için bir işlem yapılırsa, döngü f (x) = 5x = 5 ek işlemle yaptığı işi modelleyebiliriz. 20 ek element için, 20 ilave işlem daha yaparız. Bir dizinin tek bir geçişi doğrusal olma eğilimindedir. Bu yüzden, bir dizinin tek bir geçidinde bir sıralama yapmak için veri yapısından faydalanabilen kova sıralama gibi algoritmalar da vardır.
İkinci örneğiniz de doğru olurdu ve şöyle görünür:
O (N ^ 2):
for (int i = 0; i < myArray.length; i++) {
for (int j = 0; j < myArray.length; j++) {
myArray[i][j] += 1;
}
}
Bu durumda, ilk dizideki her ek öğe için, i, TÜMÜ j'yi işlememiz gerekir. 1 i ekleyerek aslında j (j uzunluğu) ekler. Böylece haklısın! Bu desen O (n ^ 2), ya da bizim örneğimizde aslında O (i * j) (ya da i == j ise n = 2, ki bu genellikle matris işlemleri ya da kare veri yapıları için geçerlidir.
Üçüncü örneğiniz, dostluğa bağlı olarak işlerin değiştiği yerdir; Eğer kod yazıldığı gibi ve şeyler ise bir sabittir, aslında sadece O (n) 'dir, çünkü 2 boyuta sahip bir diziden 2 geçişimiz olur ve 2n n' ye düşer. Döngülerin birbirlerinin dışında olması 2 ^ n kodu üretebilecek anahtar faktör değildir; işte 2 ^ n olan bir fonksiyon örneği:
var fibonacci = function (n) {
if (n == 1 || n == 2) {
return 1;
}
else {
return (fibonacci(n-2) + fibonacci(n-1));
}
}
Bu işlev 2 ^ n'dir, çünkü işleve yapılan her çağrı, işleve İKİ ek çağrı yapar (Fibonacci). Fonksiyonu her çağırdığımızda, yapmamız gereken iş miktarı iki katına çıkar! Bu hızla büyür, tıpkı bir hidranın kafasını kesmek ve her seferinde iki yeni filiz olmak gibi!
Son örneğiniz için, birleştirme sıralama gibi bir nlgn sıralama kullanıyorsanız, bu kodun O (nlgn) olacağını doğrularsınız. Bununla birlikte, belirli durumlarda daha hızlı türler geliştirmek için (1-100 gibi bilinen sınırlı bir değer aralığı gibi) verilerin yapısından yararlanabilirsiniz. Ancak, en yüksek dereceli kodun hüküm sürdüğünü düşünmekte haklısınız; Bu yüzden, O (nlgn) sıralama O (nlgn) zamandan daha az zaman alan herhangi bir işlemin yanındaysa, toplam zaman karmaşıklığı O (nlgn) olacaktır.
JavaScript'te (en azından Firefox'ta) Array.prototype.sort () 'daki varsayılan sıralama gerçekten MergeSort'tur, bu nedenle son senaryonuz için O (nlgn)' ye bakıyorsunuzdur.