genel bakış
Diğerleri ağaç diyagramları gibi iyi diyagram örnekleri verdiler. Basit kod örnekleri görmedim. Bu yüzden açıklamama ek olarak, farklı algoritma kategorilerinin karmaşıklığını göstermek için bazı baskı algoritmalarına basit baskı ifadeleri sunacağım.
İlk olarak, https://en.wikipedia.org/wiki/Logarithm'den edinebileceğiniz genel bir Logaritma fikrine sahip olmak istersiniz . Doğa bilimi kullanımı e
ve doğa günlüğü. Mühendislik öğrencileri log_10 (günlük tabanı 10), bilgisayar bilimcileri de bilgisayarlar ikili tabanlı olduğundan log_2 (günlük tabanı 2) kullanır. Bazen doğal ln()
log'un kısaltmalarını görürsünüz , mühendisler normalde _10'u kapalı bırakırlar ve sadece kullanırlar log()
ve log_2 kısaltılır lg()
. Tüm logaritma türleri benzer şekilde büyür, bu yüzden aynı kategoriyi paylaşırlar log(n)
.
Aşağıdaki kod örneklerine baktığınızda, O (1), sonra O (n), sonra O (n ^ 2) 'ye bakmanızı öneririm. Bunlarla iyi olduktan sonra, diğerlerine bakın. İnce örneklerin hala aynı kategorizasyonla nasıl sonuçlanabileceğini göstermek için temiz örneklerin yanı sıra varyasyonları da ekledim.
O (1), O (n), O (logn) vb. Sınıfları veya büyüme kategorileri olarak düşünebilirsiniz. Bazı kategorilerin yapılması diğerlerinden daha fazla zaman alacaktır. Bu kategoriler bize algoritma performansını sipariş etmenin bir yolunu sunar. Bazıları girdi n büyüdükçe daha hızlı büyüdü. Aşağıdaki tablo, söz konusu büyümeyi sayısal olarak göstermektedir. Aşağıdaki tabloda log (n) 'yi log_2'nin tavanı olarak düşünün.
Çeşitli Büyük O Kategorilerinin Basit Kod Örnekleri:
O (1) - Sabit Zaman Örnekleri:
Algoritma 1 bir kez merhaba yazdırır ve n'ye bağlı değildir, bu yüzden her zaman sabit zamanda çalışır, bu yüzden öyle O(1)
.
print "hello";
Algoritma 2, 3 kez merhaba yazdırır, ancak giriş boyutuna bağlı değildir. N büyüdükçe bile, bu algoritma her zaman sadece 3 kez merhaba yazacaktır. 3 denilen bir sabittir, dolayısıyla bu algoritma da aynıdır O(1)
.
print "hello";
print "hello";
print "hello";
O (log (n)) - Logaritmik Örnekler:
- Algoritma 3 - "log_2" gibi davranır
Algoritma 3, log_2 (n) içinde çalışan bir algoritmayı gösterir. For döngüsünün post operasyonunun i'nin mevcut değerini 2 ile i
çarptığına dikkat edin , bu yüzden 1'den 2'den 4'e 8'den 16'ya 32'ye gider ...
for(int i = 1; i <= n; i = i * 2)
print "hello";
- Algoritma 4 - Bu "log_3" gibi davranır
Algoritma 4 log_3'ü gösterir. Uyarı i
1'den 3'e 9'dan 27'ye kadar gider ...
for(int i = 1; i <= n; i = i * 3)
print "hello";
- Algoritma 5 - "log_1.02" gibi davranır
Algoritma 5 önemlidir, çünkü sayı 1'den büyük olduğu ve sonucun tekrar tekrar kendisiyle çarpıldığı sürece, logaritmik bir algoritmaya baktığınızı gösterir.
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O (n) - Doğrusal Zaman Örnekleri:
Bu algoritma basittir, ki bu da n kere basılabilir.
for(int i = 0; i < n; i++)
print "hello";
Bu algoritma, n / 2 kez merhaba yazdıracağı bir varyasyonu gösterir. n / 2 = 1/2 * n. 1/2 sabitini görmezden geliriz ve bu algoritmanın O (n) olduğunu görürüz.
for(int i = 0; i < n; i = i + 2)
print "hello";
O (n * log (n)) - nlog (n) Örnekler:
Bir kombinasyonu olarak düşünün O(log(n))
ve O(n)
. For döngülerinin yuvalanması,O(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
Algoritma 9, algoritma 8'e benzer, ancak döngülerin her biri, yine de nihai sonucun elde edilmesine neden olan varyasyonlara izin verir. O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O (n ^ 2) - n kare Örnekler:
O(n^2)
ilmekler için yuvalama standardı ile kolayca elde edilir.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
Algoritma 10 gibi, ancak bazı varyasyonlarla.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O (n ^ 3) - n küp Örnekler:
Bu algoritma 10 gibidir, ancak 2 yerine 3 döngü ile.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
Algoritma 12 gibi, ancak yine de bazı varyasyonlar var O(n^3)
.
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
özet
Yukarıda birkaç basit örnek ve analizi gerçekten değiştirmeyen hangi ince değişikliklerin uygulanabileceğini göstermeye yardımcı olacak varyasyonlar verilmiştir. Umarım size yeterince fikir verir.