Hızlı sıralama için kötü bir durum ne yapar?


10

Quicksort'u öğreniyorum ve quicksort'un zor zamanlar geçireceği farklı dizileri göstermek istiyorum. Aklımda olan quicksort ilk rastgele karıştırma yok, 2 bölüm ve medyan hesaplamak değil.

Şimdiye kadar üç örnek düşündüm:

[1,2,3,4,5,6,7,8,9,10] - when the array is sorted
[10,9,8,7,6,5,4,3,2,1] - when the array is reversed
[1,1,1,1,1,1,1,1,1,1] - when the array is the same values
[1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys

Örneğin, bundan emin değilim:

[1,3,5,7,9,10,8,6,4,2]

Peki, quicksort'un (neredeyse) ideal olduğu bir diziye kıyasla zorluk çektiği bir dizi için ne yapar?


2
Pivot nasıl seçilir? Seçilmediğini iki şekilde belirttiniz, ancak nasıl seçildiğini belirtmediniz.
Winston Ewert

Lütfen QuickSort için en kötü durumu verin - ne zaman ortaya çıkabilir? StackOverflow üzerinde bir okuma. Ben de sıralama algoritmalarının güzel bir görselleştirme olmak için sorting.at bulmak .

@WinstonEwert Pivot ilk öğe tarafından seçilir.
mrQWERTY

@ Renren29 ben soruyu odaklanmak hareket ettirmeye çalışarak biraz modifiye ettim nedenle quicksort Verilen dizi ile zorluk neden ziyade örnek diziler arayan daha (İnsanların size cevap vererek olmamak yapmak [2,1,2,1,2,1,2,1]ve bu tüm varlık Cevap). Sorunun amacı, ideal olarak, diğer insanların gelebileceği ve (sayısız olan) örneklerden ziyade neden (cevabı vardır) hakkında daha fazla bilgi edinebileceği bir soru olacaktır.

2 öğenin parçalarına hızlıca koşturuyor musunuz? Çünkü gerçek dünyadaki uygulamalar küçük parçalar için daha basit türler kullanma eğilimindedir. Örneğin, karşılaştırma ve değiştirme, N = 2 için hızlı sıralamadan çok daha basittir.
MSalters

Yanıtlar:


9

Her sıralama algoritmasının en kötü durumu vardır ve çoğu durumda en kötü durum gerçekten kötüdür, bu yüzden test etmeye değer. Sorun, sadece temel algoritmayı bildiğiniz için en kötü durum yoktur.

Sık görülen en kötü durumlar şunlardır: zaten sıralanmış; ters sırada; neredeyse sıralı, sıra dışı bir eleman; tüm değerler aynı; ilk (veya son) hariç hepsi aynı (daha yüksek) veya daha düşüktür. Bir zamanlar en kötü durumun tahmin edilmesi çok zor olan ancak pratikte oldukça yaygın olan belirli bir testere dişi modeli olduğu bir çeşit vardı.

Quicksort için en kötü durum, her zaman mümkün olan en kötü pivotu seçmesini sağlayan bir durumdur, böylece bölümlerden birinin yalnızca tek bir öğesi vardır. Pivot ilk öğeyse (kötü seçim) ise, zaten sıralanmış veya ters sıralanmış veriler en kötü durumdur. Tamamen aynı olan ya da sadece ilk ya da son olan üç medyandan oluşan pivot verisi farklıdır.


Hızlı sıralama için ortalama karmaşıklık nlogn ve en kötü durum n ^ 2'dir. En kötü durum davranışını tetiklemeye değer olmasının nedeni, aynı zamanda en büyük özyineleme derinliğini üreten durumdur. Saf bir uygulama için, özyineleme derinliği n olabilir ve bu da yığın taşmasını tetikleyebilir. Diğer aşırı durumları test etmek (en iyi durum dahil) benzer nedenlerle faydalı olabilir.


Görüyorum ki ortalamadan standart sapma bölümleme sonucunu gerçekten belirler.
mrQWERTY

“... ve neredeyse her durumda en kötü durum gerçekten kötü, bu yüzden test etmeye değer.” . Bu tartışmalıdır. Bu tabloya baktığımda: en.wikipedia.org/wiki/… Çoğu "iyi" sıralama algoritması için (yani ortalama O(NlogN)performans veya daha iyi) en kötü ve ortalama vakaların aynı karmaşıklığa sahip olduğu sonucuna varıyorum . Bu genellikle en kötü durum (lar) için test edilmeye değer DEĞİLDİR. (Testin muhtemelen O(N)... veya daha kötü olduğu göz önüne alındığında )
Stephen C

@ Renren29: 3 pivot medyan ilk veya son olarak yalnızca 2 veya 3 değer aynı ise olacaktır. SD gelmiyor.
david.pfx

@StephenC: quicksort dahil birçok 'iyi' algoritma n ^ 2 en kötü durum karmaşıklığına sahiptir. Ancak düzenlemeye bakın.
david.pfx

@ david.pfx - "Bazıları" ... EVET. "Neredeyse her" ... HAYIR.
Stephen C

0

Bir algoritma, rasgele hale getirilmiş bir pivot kullanarak çoğu kötü durumdan kaçar, sürekli öğeler hariç, bölümleme ve asimetrik aramadan bir pivota eşittir. Bir pivottan daha büyük veya ona eşit bir öğeyi ileriye doğru arar ve bir pivottan daha küçük bir öğeyi geriye doğru arar .
MichaelT'a teşekkür ediyorum, çözmek için asimetrik arama yapıldı [2,1,2,1,2,1,2,1].

Aşağıdaki sonuç benim işlev qsort_random () tarafından oluşturulur. N = 100.000

usec    call   compare   copy    pattern
80132   62946  1971278   877143  random
47326   57578  1606067   215155  sorted : 0,1,2,3,...,n-1
49927   63578  1628883   338715  sorted in reverse : n-1,n-2,...,2,1,0
55619   63781  1596934   377330  nearly reverse : n-2,n-1,n-4,n-3,...,2,3,0,1
54714   66667  1611454   290392  median-3-killer : n-1,0,1,2,...,n-2
1491    1      99999     4       all values the same : n,n,n,...
1577    1      99999     4       first is higher : n,1,1,1,...
2778    2      156159    10      last is lower : n,n,n,...,n,1
2994    3      199996    100009  a few data : n,...,n,1,...,1
3196    3      199996    50012   zigzag : n,1,n,1,...,n,1
917796  56284  67721985  673356  valley(sawtooth?) : n-1,n-3,...,0,...,n-4,n-2

Çoğu vaka rastgele bir modelden daha hızlıdır. Vadi deseni çoğu pivot seçimi için kötü bir durumdur.

qsort(3)       usec = 14523   call = 0      compare = 884463    copy = 0
qsort_head()   usec = 138609  call = 99999  compare = 8120991   copy = 1214397
qsort_middle() usec = 664325  call = 99999  compare = 52928111  copy = 1036047
qsort_trad()   usec = 118122  call = 99999  compare = 6476025   copy = 1337523
qsort_random() usec = 295699  call = 58806  compare = 19439952  copy = 732962
qsort_log2()   usec = 66411   call = 63987  compare = 1597455   copy = 944821

qsort_log2 (), log2 (N) öğelerinde bir pivot seçerek kötü durumdan kaçar.
qsort (3), birleştirme türü dizin sıralaması olan GNU kitaplığını kullanır.
qsort_trad (), ilk, orta ve son öğelerde bir pivot seçin.
qsort_random () ve qsort_log2 () takas kullanmaz.
Kaynak C programları ve komut dosyaları github'da yayınlanmıştır .

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.