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.
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