Bu soruyu soruyorum çünkü büyük O gösterimi ile ilgili bir konu hakkında kafam karıştı.
Frank Carrano'nun Java ile Veri Yapıları ve Soyutlamalar kitabını kullanıyorum . "Algoritmaların Verimliliği" bölümünde aşağıdaki algoritmayı gösterir:
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
Başlangıçta bir büyüme oranına sahip olarak algoritması anlatılmaktadır (n 2 + n) / 2 . Hangi bakmak sezgisel görünüyor.
Bununla birlikte, o zaman ifade edilmektedir (n 2 + n) / 2 davranır gibi N 2 , n büyüktür. Aynı paragrafta (n 2 + n) / 2'nin de n 2 / 2'ye benzer şekilde davrandığını belirtmektedir . Bunu yukarıdaki algoritmayı O (n 2 ) olarak sınıflandırmak için kullanır .
O olsun (n 2 + N) / 2 ile benzerdir , n 2 / 2 akıllı için yüzdesi, n, bir fark yoktur. Ne alamadım neden (n 2 + n) / 2 ve n 2 benzer, ne zaman , n büyüktür.
Örneğin, n = 1.000.000 ise :
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
Bu sonuncusu hiç de benzer değil. Aslında, oldukça açık bir şekilde, orta olanın iki katı . Peki Frank Carrano benzer olduklarını nasıl söyleyebilir? Ayrıca, algoritma O (n 2 ) olarak nasıl sınıflandırılır . Bu iç döngüye baktığımda n 2 + n / 2 olduğunu söyleyebilirim
n
büyüdükçe, hem 'n ^ 2' işlevleri hem de işleviniz benzer şekilde davranır, büyüme hızlarında sabit bir farklılık vardır. Karmaşık bir ifadeniz varsa, daha hızlı büyüyen fonksiyon hakimdir.