Burada asimptotik analizle, girişin büyüklüğü sonsuzluğa giderken algoritma davranışını kastettiğimizi farz ediyorum.
Asimptotik analiz kullanmamızın nedeni
, algoritmaların pratikteki davranışını tahmin etmede faydalı olmasıdır . Tahminler karar vermemize izin verir, örneğin bir problem için farklı algoritmalar varken hangisini kullanmalıyız? (Yararlı olmak, her zaman doğru olduğu anlamına gelmez.)
Aynı soru, herhangi bir basitleştirilmiş gerçek dünya modeli için de sorulabilir. Neden gerçek dünyanın basitleştirilmiş matematik modellerini kullanıyoruz?
Fizik düşünün. Klasik Newton fiziği, gerçek dünyayı tahmin etmede göreceli fizik kadar iyi değildir. Ancak otomobil, gökdelen, denizaltı, uçak, köprü vb. İnşa etmek için yeterince iyi bir model. Yeterince iyi olmadığı durumlar var. yıldızlar ve gezegenler gibi büyük gök cisimleri veya elektronlar gibi çok yüksek hızlı nesneler.
Bir modelin sınırlarının ne olduğunu bilmek önemlidir.
Tipik olarak gerçek dünyanın yeterince iyi bir yaklaşımıdır.
Uygulamada sıklıkla daha iyi asimptotik analiz içeren bir algoritmanın pratikte daha iyi çalıştığını görüyoruz. Bir algoritmanın, daha iyi asimptotik davranışı olduğu durum nadiren ortaya çıkar. Dolayısıyla, girdiler yeterince büyükse, algoritmalar davranışının ilk öngörüsü olarak tipik olarak asimptotik analize güvenebiliriz. Girdilerin küçük olacağını bildiğimizden emin değiliz. İstediğimiz performansa bağlı olarak, daha dikkatli bir analiz yapmamız gerekebilir, örneğin girdilerin dağılımı hakkında bilgi sahibi olursak, algoritma verilecek ise, hedeflerimize ulaşmak için daha dikkatli bir analiz yapabiliriz (örneğin hızlı girişlerin yüzdesi). Mesele ilk adımdır asimptotik analiz iyi bir başlangıç noktasıdır. Uygulamada ayrıca performans testleri yapmalı, ancak kendi sorunları olduğunu da aklımızda tutmalıyız.
Uygulamada hesaplamak oldukça kolaydır.
Genellikle, bir algoritmanın asimptotik karmaşıklığı üzerinde en azından iyi sınırları hesaplayabiliriz. Kolaylık olması açısından ismindeki bir algoritma olduğunu varsayalım izin her girişe başka bir algoritma geride. diğerlerinden daha iyi olduğunu nasıl bilebiliriz ? Biz asimptotik analiz yapmak ve görebilirsinizA AAAAdaha iyi asimptotik karmaşıklığa sahiptir. Bunların hiçbiri tüm girdilerde diğerinden daha iyi değil mi? Sonra daha zorlaşır ve neye önem verdiğimize bağlıdır. Büyük girişleri mi yoksa küçük girişleri mi önemsiyoruz? Büyük girdilere önem veriyorsak, bir algoritmanın daha iyi asimptotik karmaşıklığa sahip olması yaygın değildir, ancak önem verdiğimiz büyük girdilerde en kötü şekilde davranır. Küçük girdilere daha fazla önem veriyorsak, asimptotik analiz o kadar yararlı olmayabilir. Algoritmaların çalışma süresini, önemsediğimiz girdilerle karşılaştırmalıyız. Uygulamada, karmaşık gereksinimleri olan karmaşık işler için asimptotik analiz o kadar yararlı olmayabilir. Ders kitaplarının algoritmasını kapsayan basit temel problemler için oldukça kullanışlıdır.
Kısacası asimptotik karmaşıklık, basit temel görevler için (algoritmalar ders kitabındaki problemler) algoritmaların gerçek karmaşıklık yaklaşımını hesaplamak için nispeten kolaydır. Daha karmaşık programlar oluşturdukça performans gereksinimleri değişir ve daha karmaşık hale gelir ve asimptotik analiz o kadar yararlı olmayabilir.
Algoritmaların performansını tahmin etmek ve karşılaştırmak için asimptotik analizin diğer yaklaşımlarla karşılaştırılması iyidir. Yaygın bir yaklaşım, rastgele veya kıyaslamalı girdilere karşı performans testleridir. Asimptotik karmaşıklığın hesaplanmasında sıkça karşılaşılması zordur, örneğin, örneğin SAT çözümlemesinde olduğu gibi sezgisel tarama kullanıyorken. Başka bir durum, gereksinimlerin daha karmaşık olduğu durumlarda, örneğin bir programın performansı dış etkenlere bağlı olduğunda ve amacımız, belirli bir zaman diliminde (örneğin, bir kullanıcıya gösterilen arayüzü güncellemeyi düşünün)% 99’unda bir bitime sahip olmak olabilir. girişleri.
Ancak performans analizinin de sorunları olduğunu unutmayın. Daha az performansla ilgili matematiksel hibe vermeyenler, aslında algoritmaya verilecek tüm girdiler üzerinde performans testini yapıyoruz (genellikle hesaplama açısından olanaksız) (ve bazı girdilerin asla verilmeyeceğine karar vermek genellikle mümkün değildir). Biz rastgele bir numune ya da örtük olan bir kriter karşı üzerinde test ederseniz varsayarak bazı düzenliliği
algoritmaların performansı hakkında, yani algoritma performans testi parçası değildi diğer girdileri benzer gerçekleştirecek.
Performans testleriyle ilgili ikinci sorun, test ortamına bağlı olmalarıdır. Yani, bir programın performansı yalnız girdiler tarafından değil, dışarıdaki faktörler (örneğin makine tipi, işletim sistemi, kodlanmış algoritmanın etkinliği, CPU kullanımı, bellek erişim süreleri vb.) İle belirlenir. Aynı makinede test. Yine burada, performans testinin gerçekleştirildiği belirli ortamların, programı çalıştırabileceğimiz tüm ortamlar üzerinde performans testleri yapmazsak (ve hangi makinelerin bir sıralamada çalışacağını nasıl tahmin edebileceğimizi tahmin edemezsek), gerçek ortama benzer olduğunu varsayıyoruz. 10 yıl içinde algoritma?).
Bunları, MergeSort ( ) deyiminin asimptotik çalışma zamanını hesaplamak ve bunu SelectionSort ( ) veya BinarySerch ( çalışma zamanıyla karşılaştırmakla karşılaştırın ) LinearSearch ( ) ile birlikte.Θ ( n 2 ) Θ ( lg n ) 0 ( n )Θ(nlgn)Θ(n2)Θ(lgn)O(n)