Kodu Matematiğe Çevirmek
(Daha fazla veya daha az) resmi bir işlemsel anlambilim kuralı olarak, bir algoritmanın (sözde) kodunu kelimenin tam anlamıyla, ifadeyi yararlı bir forma sokabilmeniz koşuluyla size sonuç veren matematiksel bir ifadeye çevirebilirsiniz. Bu , karşılaştırma sayısı, takas, açıklama, hafıza erişimi, bazı soyut makinelerin ihtiyaç duyduğu döngüleri vb. İlave maliyet ölçümleri için iyi çalışır .
Örnek: Bubblesort'taki Karşılaştırmalar
Belirli bir diziyi sıralayan bu algoritmayı düşünün A
:
bubblesort(A) do 1
n = A.length; 2
for ( i = 0 to n-2 ) do 3
for ( j = 0 to n-i-2 ) do 4
if ( A[j] > A[j+1] ) then 5
tmp = A[j]; 6
A[j] = A[j+1]; 7
A[j+1] = tmp; 8
end 9
end 10
end 11
end 12
Diyelim ki, sıralı sıralama algoritması analizini yapmak istiyoruz, bu da element karşılaştırma sayısını sayar (satır 5). Hemen bu miktarın, dizinin içeriğine bağlı olmadığını A
, sadece uzunluğuna bağlı olduğunu not ediyoruz n. Böylece (yuvalanmış) for
halkaları tam anlamıyla (yuvalanmış) toplamlara çevirebiliriz; döngü değişkeni birleştirme değişkeni haline gelir ve aralık devam eder. Biz alırız:
,Ccmp(n)=∑i=0n−2∑j=0n−i−21=⋯=n(n−1)2=(n2)
buradaki , 5. satırdaki her bir işlemin maliyetidir (ki biz sayarız).1
Örnek: Bubblesort'ta takaslar
Ben tarafından ifade edeceğiz hattından oluşmaktadır alt programı için ve tarafından C i , j bu alt programı (bir kez) yürütmek için maliyetleri.Pi,ji
j
Ci,j
Şimdi de saymak istediğiniz diyelim takaslarını , ne kadar sıklıkla yürütülür. Bu bir "temel blok", yani her zaman atomik olarak yürütülen ve sabit bir maliyeti olan bir alt programdır (burada, 1 ). Bu tür blokların sözleşme yapılması, genellikle düşünmeden veya konuşmadan uygulayacağımız kullanışlı bir basitleştirmedir.P6,81
Yukarıdaki gibi benzer bir çeviri ile aşağıdaki formüle geliyoruz:
.Cswaps(A)=∑i=0n−2∑j=0n−i−2C5,9(A(i,j))
daha önce dizinin durumunu belirtmektedir ( i , j ) bir inci yineleme P 5 , 9 .A(i,j)(i,j)P5,9
Parametre olarak n yerine kullandığımı unutmayın ; Yakında neden göreceğiz. Ben katmayan i ve j parametreleri olarak C 5 , 9 (maliyetlerin beri burada onlara bağlı olmayan tek tip maliyet modeline yani); genel olarak, sadece olabilir.AnijC5,9
Açıktır ki, maliyeti içeriğine bağlıdır A (değerler ve özellikle de) bu nedenle bu hesaba gerekir. Şimdi bir zorlukla karşı karşıyayız: C 5 , 9'u nasıl açıyoruz ? A'nın içeriğine bağımlılığı yapabiliriz :P5,9AA[j]
A[j+1]
C5,9A
.C5,9(A(i,j))=C5(A(i,j))+{10,A(i,j)[j]>A(i,j)[j+1],else
Herhangi bir giriş dizisi için, bu maliyetler iyi tanımlanmıştır, ancak daha genel bir ifade istiyoruz; daha güçlü varsayımlarda bulunmamız gerekiyor. Üç tipik olayı araştıralım.
En kötü durum
Sadece toplamı incelemek ve değerine dikkat çekerek, maliyet için önemsiz bir üst sınır bulabiliriz:C5,9(A(i,j))∈{0,1}
.Cswaps(A)≤∑i=0n−2∑j=0n−i−21=n(n−1)2=(n2)
Ancak bu olabilir mi , yani bu üst sınırın elde edildiği için bir var mı? Görünen o ki, evet: tersine sıralanmış bir ikili ayrı eleman dizisi girersek, her yineleme bir takas gerçekleştirmelidir. Bu nedenle, bubblesort'un en kötü durumda olan takas sayısını kesin olarak belirledik.A
En iyi durum
Tersine, önemsiz bir alt sınır var:
.Cswaps(A)≥∑i=0n−2∑j=0n−i−20=0
Bu da olabilir: zaten sıralanan bir dizide, Bubblesort tek bir takas yürütmez.
Ortalama durum
En kötü ve en iyi durum oldukça açık. Fakat tipik takas sayısı nedir? Bu soruyu cevaplamak için "tipik" ifadenin ne anlama geldiğini tanımlamamız gerekir. Teoride, bir girişi bir başkasına tercih etmek için hiçbir nedenimiz yoktur ve bu nedenle genellikle tüm olası girdiler üzerinde eşit bir dağılım olduğunu varsayıyoruz , bu da her girdi eşit derecede muhtemeldir. İkili ayrı elementler içeren dizileri kendimizle sınırlıyoruz ve böylece rastgele permütasyon modelini üstleniyoruz .
Ardından, bu gibi masraflarımızı yeniden yazabiliriz:
E[Cswaps]=1n!∑A∑i=0n−2∑j=0n−i−2C5,9(A(i,j))
Şimdi toplamların basit manipülasyonunun ötesine geçmeliyiz. Algoritması bakarak, biz her takas tam olarak bir kaldırır dikkat inversiyon içinde (biz sadece hiç neighbours³ takas). Bu, üzerinde yapılan swap sayısını, A tam inversiyon sayısıdır inv ( A ) arasında bir . Böylece içsel iki toplamı değiştirebiliriz.AAinv(A)A
.E[Cswaps]=1n!∑Ainv(A)
Şanslıyız ki, ortalama inversiyon sayısı
E[Cswaps]=12⋅(n2)
bu bizim nihai sonucumuz. Bunun en kötü durum maliyetinin yarısı kadar olduğuna dikkat edin.
- Algoritmanın dikkatli bir şekilde formüle edildiğine dikkat edin
i = n-1
, dış döngü ile hiçbir şey yapmadan "son" yineleme yapılmaz.
- E
- Biz o yol boyunca öğrenmek hayır sadece komşu elemanlarını değiştirir algoritma asimptotik hızlı (hatta ortalama olarak) BubbleSort daha olabilir - inversiyon sayısı bir alt sınır tür tüm algoritmalar içindir. Bu, örneğin Ekleme Sıralama ve Seçim Sıralama için geçerlidir .
Genel Yöntem
Örnekte kontrol yapısını matematiğe çevirmemiz gerektiğini gördük; Tipik bir çeviri kuralları topluluğu sunacağım. Ayrıca herhangi bir alt programın maliyetinin mevcut duruma bağlı olduğunu, yani değişkenlerin şu anki değerlerine (kabaca) bağlı olduğunu gördük . Algoritma (genellikle) durumu değiştirdiğinden, genel metot not almak için biraz hantaldır. Kafanız karıştıysa, örneğe geri dönmenizi veya kendinize ait bir şeyler yapmanızı öneririm.
Mevcut durumu ile gösteririz (bunu bir değişken atama kümesi olarak hayal edin). Bir programı çalıştırmak zaman durum başlangıç ψ , bir devlet sona ψ / P (Resim sonlandırır).ψP
ψψ/PP
Bireysel ifadeler
S;
CS(ψ)
İfade
E
Formun bir ifadesi varsa E1 ∘ E2
(örneğin, ∘
toplama veya çarpma olabilecek bir aritmetik ifade) , maliyetleri tekrarlı olarak eklersiniz:
CE(ψ)=c∘+CE1(ψ)+CE2(ψ)
Bunu not et
- c∘E1E2
- ifadelerin değerlendirilmesi birçok dilde devleti değiştirebilir,
bu kural ile esnek olmanız gerekebilir.
Sıra
P
Programların sırası olarak bir program göz önüne alındığında Q;R
, maliyetleri
CP(ψ)=CQ(ψ)+CR(ψ/Q)
Şartlılar
P
Formun bir programı göz önüne alındığında if A then Q else R end
, maliyetler devlete bağlıdır:
CP(ψ)=CA(ψ)+{CQ(ψ/A)CR(ψ/A),A evaluates to true under ψ,else
Genel olarak, değerlendirme A
, durumu çok iyi değiştirebilir, dolayısıyla bireysel branşların maliyetleri için güncelleme yapılabilir.
-Loops için
P
Formun bir programı göz önüne alındığında for x = [x1, ..., xk] do Q end
, maliyet atamak
CP(ψ)=cinit_for+∑i=1kcstep_for+CQ(ψi∘{x:=xi})
ψiQ
xi
x
x1
xi-1
cinit_forcstep_for
- Bir sonraki hesaplama
xi
pahalı olabilir ve
for
Boş gövdeli bir döngü (örneğin, belirli bir maliyetle en iyi durum ayarında sadeleştirmeden sonra), yineleme yaparsa sıfır maliyeti yoktur.
-Loops iken
P
Formun bir programı göz önüne alındığında while A do Q end
, maliyet atamak
CP(ψ) =CA(ψ)+{0CQ(ψ/A)+CP(ψ/A;Q),A evaluates to false under ψ, else
Algoritmayı inceleyerek, bu tekrarlama genellikle for-loop'lara benzer bir toplam olarak güzel bir şekilde gösterilebilir.
Örnek: Bu kısa algoritmayı düşünün:
while x > 0 do 1
i += 1 2
x = x/2 3
end 4
Kuralı uygulayarak alırız
C1,4({i:=i0;x:=x0}) =c<+{0c+=+c/+C1,4({i:=i0+1;x:=⌊x0/2⌋}),x0≤0, else
c…i
x
C1,4i
C1,4(x)={c>c>+c+=+c/+C1,4(⌊x/2⌋),x≤0, else
Bu birlikte çözer temel aracı için
C1,4(ψ)=⌈log2ψ(x)⌉⋅(c>+c+=+c/)+c>
ψ={…,x:=5,…}ψ(x)=5
Prosedür Çağrıları
Bazı parametreler P
için formun bir programı verildiğinde , (adlandırılmış) parametresiyle bir prosedür olan maliyetler atayınM(x)
x
M
p
CP(ψ)=ccall+CM(ψglob∘{p:=x})
ccallψ
Buradaki devletle ilgili olabilecek bazı anlamsal sorunları anlatıyorum. Küresel durumu ve bu tür yerel işlemleri prosedür çağrılarına göre ayırt etmek isteyeceksiniz. Sadece biz burada sadece küresel devlet geçmek ve varsayalım M
değerini ayarlayarak başlatıldı yeni bir yerel devlet, alır p
için x
. Ayrıca, x
(genellikle) geçmeden önce değerlendirmeyi düşündüğümüz bir ifade olabilir.
Örnek: Prosedürü düşünün
fac(n) do
if ( n <= 1 ) do 1
return 1 2
else 3
return n * fac(n-1) 4
end 5
end
Kurallara göre:
Cfac({n:=n0})=C1,5({n:=n0})=c≤+{C2({n:=n0})C4({n:=n0}),n0≤1, else=c≤+{creturncreturn+c∗+ccall+Cfac({n:=n0−1}),n0≤1, else
fac
Hiçbir şekilde erişemediği için küresel devleti göz ardı ettiğimizi unutmayın . Bu özel yinelemenin çözülmesi kolaydır
Cfac(ψ)=ψ(n)⋅(c≤+creturn)+(ψ(n)−1)⋅(c∗+ccall)
Tipik sözde kodla karşılaşacağınız dil özelliklerini ele aldık. Üst düzey sahte kodu analiz ederken gizli maliyetlere dikkat edin; şüphe durumunda, açılmak. Notasyon hantal görünebilir ve kesinlikle bir zevk meselesidir; Yine de listelenen kavramlar göz ardı edilemez. Bununla birlikte, bazı deneyimlerle, devletin hangi kısımlarının hangi maliyet ölçüsü için uygun olduğunu hemen görebileceksiniz, örneğin "sorun boyutu" veya "tepe noktası sayısı". Gerisi düşebilir - bu işleri önemli ölçüde kolaylaştırır!
Bu çok karmaşık olduğunu şimdi düşünüyorsanız, tavsiye edilebilir: Bu olduğunu ! Gerçek zamanlı makinelere çalışma süresi tahminlerini (göreceli olanlar bile) mümkün kılacak kadar yakın olan herhangi bir modelde algoritmaların kesin maliyetlerini türetmek zor bir çabadır. Ve bu, gerçek makineler üzerindeki önbellekleme ve diğer kötü etkileri dikkate almıyor bile.
Bu nedenle, algoritma analizi genellikle matematiksel olarak izlenebilir olma noktasına göre basitleştirilmiştir. Örneğin, kesin bir maliyete ihtiyacınız yoksa, herhangi bir noktada (üst ve alt sınırlar için) aşırı veya düşük tahmin edebilirsiniz: sabitleri azaltın, koşullardan kurtulun, toplamları basitleştirin, vb.
Asimptotik maliyet notu
n
Bu (genellikle) adildir, çünkü soyut ifadeler , makineye, işletim sistemine ve diğer faktörlere bağlı olarak gerçekte bazı (genel olarak bilinmeyen) maliyetlere sahiptir ve işlemi ilk etapta ve ne olursa olsun yapan işletim sistemi tarafından kısa çalışma sürelerine hâkim olabilir. Zaten biraz sapkınlık yaşarsın.
Asimptotik analizin bu yaklaşımla ilişkisi:
Tanımlayın baskın , yani (sabit faktörlere kadar) en sık ortaya operasyonlar (yani maliyetleri teşvik) işlemleri. Bubblesort örneğinde, olası bir seçenek, 5. satırdaki karşılaştırmadır.
Alternatif olarak, temel işlemler için tüm sabitleri en fazla (yukarıdan) karşılık olarak bağlarlar. minimum (aşağıdan) ve normal analiz yapın.
- Bu işlemin yürütme sayılarını maliyet olarak kullanarak analizi gerçekleştirin.
- OΩ
O
daha fazla okuma
Algoritma analizinde daha birçok zorluk ve püf noktası var. İşte önerilen bazı okumalar.
Algoritma analizi etiketli birçok soru var, buna benzer teknikler kullanıyor.