İki yarının tüm veri setiyle uğraşma işinin yarısından daha azını alırsa, bunun bir sorunu çözmeyi daha hızlı hale getirmesi bana mantıklı geliyor.
Bu, böl ve fethe algoritmalarının özü değildir . Genellikle mesele, algoritmaların “tüm veri setiyle tümüyle” başa çıkamadığıdır. Bunun yerine, çözülmesi önemsiz parçalara bölünür (iki sayıyı sıralamak gibi), sonra bunlar önemsizce çözülür ve sonuçlar tam veri seti için bir çözüm getirecek şekilde yeniden birleştirilir.
Peki neden veriyi üç bölüme ayırmıyorsunuz? Dört? n?
Esas olarak, onu ikiden fazla parçaya bölmek ve ikiden fazla sonucu yeniden biraraya getirmek, daha karmaşık bir uygulama ile sonuçlanır ancak algoritmanın temel (Büyük O) özelliğini değiştirmez - fark sabit bir faktördür ve yavaşlamaya neden olabilir 2'den fazla alt grubun bölünmesi ve yeniden birleştirilmesi ek yük oluşturursa.
Örneğin, 3 yollu bir birleştirme sıralaması yaparsanız, yeniden birleştirme aşamasında, artık her öğe için 1 yerine 2 karşılaştırma gerektiren en büyük 3 öğeyi bulmanız gerekir, bu nedenle toplamda iki kat daha fazla karşılaştırma yaparsınız. . Buna karşılık, tekrarlama derinliğini bir ln (2) / ln (3) == 0,63 oranında azaltırsınız, böylece% 37 daha az takas değeriniz vardır, ancak 2 * 0,63 ==% 26 daha fazla karşılaştırma (ve hafıza erişim). Bunun iyi veya kötü olması donanımınızda hangisinin daha pahalı olduğuna bağlıdır.
Ayrıca 3 yollu quicksort'a birçok referans gördüm. Bu ne zaman daha hızlı?
Görünüşe göre, bir quick pivot çift pivot varyantının aynı sayıda karşılaştırmayı gerektirdiği kanıtlanabilir, ancak ortalama olarak% 20 daha az takas, bu nedenle net bir kazanç.
Uygulamada ne kullanılır?
Bugünlerde neredeyse hiç kimse artık kendi sıralama algoritmalarını programlar; Bir kütüphane tarafından sağlanan bir kullanın. Örneğin, Java 7 API'si aslında çift eksenli hızlı bağlantı noktasını kullanır.
Aslında bir nedenden ötürü kendi sıralama algoritmasını programlayan insanlar, basit 2-yollu varyantlara bağlı kalma eğilimindedir, çünkü hatalar için daha az potansiyel çoğu zaman% 20 daha iyi performans gösterir. Unutmayın: Bugüne kadarki en önemli performans iyileştirme, kodun “çalışmamadan” “çalışmaya” gitmesidir.