Algoritmaların amortize edilmiş analizi nedir? [kapalı]


85

Asimptotik analizden farkı nedir? Ne zaman ve neden kullanıyorsunuz?

İyi yazılmış gibi görünen bazı makaleler okudum, örneğin:

ancak bu kavramları hala tam olarak anlamadım.

Öyleyse, lütfen biri benim için basitleştirebilir mi?



2
@lanzz Belki artık cs.stackexchange.com'a
nbro

Sabit Amortize Edilmiş Zamanın anlamı hakkında harika bir başlık .
RBT

Yanıtlar:


88

Amortize edilmiş analiz, çağrı sayısını safça bir çağrı için en kötü durumla çarpmaz.

Örneğin, gerektiğinde boyut olarak iki katına çıkan dinamik bir dizi için, normal asimptotik analiz yalnızca ona bir öğe eklemenin O (n) maliyeti olduğu sonucuna varır, çünkü tüm öğeleri yeni diziye kopyalaması ve büyütmesi gerekebilir. Amortize edilmiş analiz, büyümek zorunda kalabilmek için n / 2 öğenin önceki büyümeden bu yana büyümeye neden olmadan eklenmesi gerektiğini dikkate alır, bu nedenle bir öğe eklemek gerçekten yalnızca O (1) alır (O (n) maliyeti n / 2 eylem üzerinden amortize edilmiştir).

Amortize edilmiş analiz, "ortalama performans" ile aynı şey değildir - amortize edilmiş analiz, çok fazla eylem yaparsanız performansın ne yapacağı konusunda kesin bir garanti verir .


1
"Amortize edilmiş analiz, büyümek zorunda kalabilmek için n / 2 öğenin önceki büyümeden bu yana büyümeye neden olmadan eklenmesi gerektiğini hesaba katar, bu nedenle bir öğe eklemek gerçekten yalnızca O (1) alır (O (n) maliyeti n / 2 eylem üzerinden itfa edilir). " Bu oldukça kafa karıştırıcı ve belirsizdi.
AleksandrH

@AleksandrH bunun belirli bir parçası?
harold

Evet, sayıların nereden geldiğine dair bir açıklama yapmadan matematiği takip etmek zor
AleksandrH

44

"Ne" nin pek çok yanıtı var ama "neden" için hiçbiri yok.

Herkesin söylediği gibi, asimptotik analiz, belirli bir işlemin performansının büyük bir veri kümesine nasıl ölçeklendiğiyle ilgilidir. Amortize edilmiş analiz, büyük bir veri seti üzerindeki tüm işlemlerin ortalama performansının nasıl ölçeklendiğiyle ilgilidir. Amortize edilmiş analiz asla asimptotikten daha kötü sınırlar vermez ve bazen çok daha iyi sınırlar verir.

Daha uzun bir işin toplam çalışma süresiyle ilgileniyorsanız, amortize edilmiş analizin daha iyi sınırları muhtemelen sizin ilgilendiğiniz şeydir. Bu nedenle, kodlama dilleri (örneğin), pahalı bir işlem olmasına rağmen, dizileri ve karma tabloları bazı faktörlere göre büyütmekten memnun olurlar. (Büyümek bir O(n)operasyon olabilir, ancak O(1)bunu nadiren yaptığınız için amorti edilir .)

Gerçek zamanlı programlama yapıyorsanız (bireysel işlemler öngörülebilir bir sürede tamamlanmalıdır), amortize edilmiş analizin daha iyi sınırlarının önemi yoktur. İşlemin ortalama hızlı olup olmadığı önemli değil, eğer geri dönmek için zamanında bitiremezseniz ve şerit testereyi çok fazla kesmeden önce ayarlayamazsanız ...

Sizin durumunuzda hangisinin önemli olduğu, programlama probleminizin tam olarak ne olduğuna bağlıdır.


1
"Büyüme bir O (n) işlemi olabilir, ancak amortisman O (1) 'dir çünkü bunu nadiren yaparsınız" Bence bu ifadenin gerçekten katı bir matematiksel kanıta ihtiyacı var.
nbro

"Gerçek zamanlı programlama yapıyorsanız ..." daha kesin olmalı ve bu paragrafın neden "doğru" olarak alınması gerektiğini tam olarak açıklamalısınız.
nbro

1
@nbro Neden "gerekir" diye düşünüyorsun? Soru, amortize edilmiş analizin asimptotikten ne kadar farklı olduğunu ve her birini ne zaman kullanmak istediğinizi sorar. Bunların nasıl yapılacağını açıklayan makalelere bağlantı verir. Dolayısıyla matematiksel analiz gereksiz görünüyor. Gerçek zamanlı programlamaya gelince, bunu açıkladım. Gerçek zamanlı programlama, bireysel işlemlerin öngörülebilir bir sürede tamamlanması gereken programlamadır. Tipik bir örnek, düzenli aralıklarla bir şeyi izlemeniz gereken gömülü programlamadır. Makinaları kontrol etmek gibi. Bu durumda, ara sıra yavaş işlemler kabul edilemez.
btilly

27

Asimptotik analiz

Bu terim, algoritmanın üzerinde çalıştığı verilerin ( girdi ), layman'ın terimleriyle, "onu büyütmenin sonucu değiştirmeyecek kadar büyük olduğu" varsayımı altında algoritma performansının analizini ifade eder . Giriş tam boyutu belirtilmesi gerekmez, ancak verilerinin kendisi set (yalnızca bir üst bağlanmış mi) sahiptir belirtilmelidir.

Şimdiye kadar sadece analiz yöntemi hakkında konuştuğumuzu unutmayın ; tam olarak hangi miktarı analiz ettiğimizi (zaman karmaşıklığı? uzay karmaşıklığı?) belirtmedik ve hangi ölçüyle ilgilendiğimizi de belirtmedik (en kötü durum? en iyi durum? ortalama?).

Pratikte asimptotik analiz terimi genellikle bir algoritmanın üst sınır zaman karmaşıklığına , yani büyük-Oh gösterimi ile temsil edilen toplam çalışma süresi ile ölçülen en kötü durum performansına (örneğin, bir sıralama algoritması olabilir O(nlogn)) atıfta bulunur .

Amortize edilmiş analiz

Bu terim, en kötü durum senaryosunu hedefleyen belirli bir işlem sırasına dayalı algoritma performansının analizini ifade eder - yani amortize edilmiş analiz, metriğin en kötü durum performansı olduğunu ima eder (yine de hangi miktarın ölçüldüğünü söylememektedir ). Bu analizi yapmak için girdinin boyutunu belirlememiz gerekiyor ancak biçimi hakkında herhangi bir varsayımda bulunmamıza gerek yok.

Layman'ın terimleriyle, amortize edilmiş analiz girdi için rastgele bir boyut seçmek ve ardından algoritmayı "oynatmak" tır. Girdiye bağlı bir karar verilmesi gerektiğinde, en kötü yol alınır¹. Algoritma tamamlandıktan sonra, hesaplanan karmaşıklığı girdinin boyutuna bölerek nihai sonucu elde ederiz.

¹not: Kesin olmak gerekirse, teorik olarak mümkün olan en kötü yol . Kapasitesi her tükendiğinde dinamik olarak iki katına çıkan bir vektöre sahipseniz, "en kötü durum" , eklemeler bir dizi olarak işlendiği için her eklemede iki katına çıkması gerekeceği anlamına gelmez . Bilinen durumu , girdi bilinmeyen kalsa bile, elimizden geldiğince çok sayıda "daha da kötü" durumu matematiksel olarak ortadan kaldırmak için kullanabiliriz (ve aslında kullanmamız gerekir) .

En önemli fark

Asimptotik ve amortize edilmiş analiz arasındaki kritik fark, birincisinin girdinin kendisine bağlı olması, ikincisinin ise algoritmanın yürüteceği işlemlerin sırasına bağlı olmasıdır.

Bu nedenle:

  • asimptotik analiz, algoritmanın karmaşıklığının, N'ye yaklaşan büyüklükte en iyi / en kötü / ortalama durum girdisi verildiğinde, bazı F (N) fonksiyonuyla sınırlandığını iddia etmemize izin verir - burada N bir değişkendir
  • Amortize edilmiş analiz, algoritmanın karmaşıklığının bilinmeyen özelliklere sahip bir girdi verildiğinde, ancak bilinen boyut N'nin bir F (N) işlevinin değerinden daha kötü olmadığını iddia etmemize olanak tanır - burada N bilinen bir değerdir

7
Yukarıdaki cevap, insanların neden yüksek dereceli insanlardan gelen uzun cevapları körü körüne kabul etmemeleri gerektiğini gösteriyor.
btilly

2
@btilly: Geri bildiriminiz eyleme geçirilebilir olsaydı çok daha yararlı olurdu - yani, bu yanıtta tam olarak neyin yanlış olduğu ve nasıl iyileştirilebileceği konusunda bana bir fikir verebilir misiniz?
Jon

7
nereden başlamalı? Her iki terimi de yanlış tanımladınız ve yine yanlış olan birçok açıklayıcı ayrıntı verdiniz. Rastgele bir örnek için, amortize edilmiş analiz her zaman en kötü durum değildir. Aksi takdirde, dinamik olarak yeniden boyutlandırılmış bir hash'e eklemenin amortize edilmiş performansının olduğunu söyleyemeyiz O(1).
btilly

@btilly CLRS sayfa 451, "... amortize edilmiş analiz, her işlemin en kötü durumda ortalama performansını garanti eder" diyor.
Glen Selle

1
@GlenSelle Amortize edilmiş analiz matematiksel bir tekniktir. En kötü durum performansı dahil olmak üzere çeşitli amaçlar için kullanılabilir. Ancak en kötü durum olması gerekmez. Sizin durumunuzda, görünüşe göre en kötü durumda kullanılmış. Hashing durumunda, öyle değildi.
btilly

14

Bunun cevabı, Algoritmalara Giriş kitabındaki Amortize Edilmiş Analiz bölümünün ilk cümlesiyle kısaca tanımlanmıştır:

Bir in itfa edilmiş analizi , zaman veri yapısı işlemlerinin bir dizi operasyon gerçekleştirilen tüm üzerinden ortalaması alınır gerçekleştirmek için gereken.

Bir programın büyümesinin karmaşıklığını, programın büyümesini bir işlevle sınırlayan ve bunun en kötü, en iyi veya ortalama durumunu tanımlayan Asimptotik analizle temsil ediyoruz.

Ancak bu, programın karmaşıklığının zirveye ulaştığı tek bir durumun olduğu, ancak genel olarak programın fazla hesaplama gerektirmediği durumlarda yanıltıcı olabilir.

Bu nedenle, tek bir işlem pahalı olsa bile, bir dizi işlemin maliyetini ortalamak daha mantıklıdır. Bu Amortize Edilmiş Analiz!

Amortize Analiz, karmaşıklığı hesaplamak için kullanılan Asimptotik tekniğe bir alternatiftir. İki veya daha fazla algoritma arasında karşılaştırma yapmak ve karar vermek için pratiklik açısından daha gerçek bir karmaşıklık hesaplamamıza yardımcı olur.


5

Algoritmaların amortize edilmiş analizini anlamak için şimdiye kadar bulduğum en iyi referans, Algoritmalara Giriş , üçüncü baskı, bölüm 17: "Amortize Edilmiş Analiz" kitabında . Hepsi orada, bir Stack Overflow gönderisinde bulunabileceklerden çok daha iyi açıklandı. Kitabı herhangi bir düzgün üniversitenin kütüphanesinde bulacaksınız.


Evet. Bahsedilen kitaptan Amortized algoritması hakkında okumak daha iyiydi ve sonunda netlik sağladı.
Rajesh Mappu

2

Düzenli asimptotik analiz, problemin boyutunun bir fonksiyonu olarak, bireysel bir işlemin performansına asimptotik olarak bakar. O () gösterimi, asimptotik bir analizi gösteren şeydir.

Amortize edilmiş analiz (aynı zamanda bir asimptotik analizdir), paylaşılan bir veri yapısı üzerindeki birden çok işlemin toplam performansına bakar .

Aradaki fark, amortize edilmiş analizin tipik olarak M operasyonları için gereken toplam hesaplamanın, bireysel operasyon için en kötü durumun M katından daha iyi bir performans garantisine sahip olduğunu kanıtlamasıdır.

Örneğin, N boyutundaki bir yayılma ağacındaki tek bir işlem O (N) süreye kadar sürebilir. Bununla birlikte, N boyutundaki bir ağaç üzerindeki bir M işlem dizisi, işlem başına kabaca O (log N) olan O (M (1 + log N) + N log N) süresi ile sınırlandırılmıştır. Ancak, amortize edilmiş bir analizin "ortalama durum" analizinden çok daha katı olduğuna dikkat edin: olası herhangi bir işlem dizisinin, asimptotik en kötü durumu tatmin edeceğini kanıtlar .


1

Amortize edilmiş analiz, bir dizi rutin çalışmadaki toplam maliyet ve burada kazanılabilecek faydalarla ilgilenir. Örneğin, sıralanmamış bir dizi n öğeden oluşan tek bir eşleşme için arama yapmak n karşılaştırma alabilir ve bu nedenle o (n) karmaşıklığı olur. Bununla birlikte, aynı dizinin m öğe için aranacağını bilirsek, toplam görevi tekrarladığımızda karmaşıklık O (m * n) olacaktır. Bununla birlikte, diziyi önceden sıralarsak, maliyet O (n log (n)) olur ve ardışık aramalar, sıralanmış bir dizi için yalnızca O (log (n)) alır. Bu nedenle, bu yaklaşımı kullanan m elementlerin toplam amorti edilmiş maliyeti O (n * log (n) + m * log (n)) 'dir. Eğer m> = n ise, bu, sıralama yapmama için O (n ^ 2) ile karşılaştırıldığında ön sıralama ile O (n log (n)) 'ye eşittir. Dolayısıyla, amorti edilmiş maliyet daha ucuzdur.

Basitçe söylemek gerekirse, erkenden biraz daha fazla harcama yaparak, daha sonra çok tasarruf edebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.