2013-05-10 16 views
5

I hoparlör O (n) davranışı tetikler ilkel türleri için Arrays.sort bir giriş oluşturmak için McIlroy en kağıt A Killer Adversary for Quicksort açıklanan tekniği kullanmıştı hangi gün bir sunum gördü. Sıra, pivot seçiminin her zaman sadece dizi boyutunu bir sabitle azaltmasına neden oldu ve bu da Java Arrays.sort işlevinin yığın taşmasına neden olmasına neden oldu. the source files from the JDK göreJDK quicksort uygulaması neden yığın taşması riskini taşıyor?

, Arrays.sort1 quicksort uygulama fonksiyonu yığın taşmaları önlemek için bir koruyuculuk sahiptir. Sıralama rutini iki tekrarlı çağrıyı söndürmemek, bunun yerine daha büyük alt dizge için geçerli yığın çerçevesini yeniden kullanmak ve yalnızca bir kez yinelemek (daha küçük alt dizede) için bir while döngüsü kullanmak her zaman hızlı bir şekilde taşma yapmaktır. Bu, minimum performans düşüşüne neden olur ve istif derinliği hiçbir zaman n büyüklüğündeki bir girdi üzerindeki O (log n) yığın çerçevelerini asla aşmadığından, makul boyuttaki herhangi bir girdi için yığın taşmasına neden olmasını imkansız kılar. Yazarlar ayrıca, bunu engellemek için quicksort yineleme derinliği bir sınırı aştığında en kötü durumdaki O (n log n) sıralama algoritmasına geçmek için quicksort'u değiştiren introsort algoritmasını kullanabilirdi.

Arrays.sort'un yazarlarının bunu yapmayı tercih etmesinin herhangi bir nedeni var mı? Yerleşik bir sıralama algoritmasının yığın taşmasına neden olacağı ciddi bir problem gibi görünüyor, çünkü tekrarlanan yığın taşmaları tetiklenerek böyle bir sisteme karşı bir DoS saldırısı başlatılmasını mümkün kılıyor.

+0

Bunun için Vladimir Yaroslavskiy, Jon Bentley veya Josh Bloch'a sormamız gerek. Ancak java 1.7'de sort1 yöntemi kaldırılır ve bir DualPivotQuicksort ile değiştirilir, ancak bu yaklaşımın eski yaklaşım olarak daha iyi olup olmadığını anlamak için yeterince iyi değilim. – mszalbach

cevap

5

Neden? Çünkü problemi çözmek çok zor olurdu.

Kullanılan algoritma, istisnai olarak olağandışı durumların hepsinde sabit olacaktır ve bu koşullar genellikle oluşma olasılığından daha fazla ise, durum harici olarak korunacaktır. Bu yüzden sahnelerin arkasında kullanılan algoritmayı tanımlayan API belgelerine sahipler. Yani size karşı karşı savunabilir.

Sunulan algoritmayı bozan belirli siparişin şansı küçüktür.

Yeterince dikkatli bakarsanız, hemen hemen tüm standart JVM yapılarının kırılmasına neden olan veri kümeleri olacağını umuyorum. Onlara karşı korunma maliyeti nedir ve savunmaya yönelik maliyetler ve savunma önlemleri nedeniyle algoritmanın kaçınılmaz bozulmasıdır.

İlgili konular