• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

QuickSort - złożoność obliczeniowa

Object Storage Arubacloud
0 głosów
420 wizyt
pytanie zadane 24 października 2021 w Algorytmy przez Zio Nowicjusz (180 p.)
W jaki sposób złożoność obliczeniowa algorytmu QuickSort jest zależna od wyboru elementu dzielącego x oraz od struktury sortowanego ciągu liczb?

2 odpowiedzi

+1 głos
odpowiedź 25 października 2021 przez Jakub 0 Pasjonat (23,120 p.)
edycja 25 października 2021 przez Jakub 0

Sortowanie szybkie w średnim przypadku ma złożoność O(n log n), a w najgorszym O(n ^ 2). To z jakim przypadkiem mamy do czynienia zależy od elementu osiowego.

Powiedzmy, że kiedy jako element osiowy wybierzesz jakieś X, to znajdziesz blisko połowę wartości mniejszych od X i połowę większych (i tak dla każdego wywołania rekursywnego, aż do przypadku podstawowego). Wtedy dla każdego poziomu musisz przejść przez n elementów, by je ustawić po odpowiedniej stornie osi. Następne wywołanie otrzyma listę o długości n/2 (bo elementy listy rozdzieliły się po połowie wokół osi) itd... Mnożysz O(n) * O(log n) i wychodzi O(n log n).

A co gdybyś po wybraniu osi X miał pecha, bo po lewej stronie znalazła by się tylko jedna liczba, a po prawej wszystkie pozostałe? Przykładem może być następujący ciąg przy założeniu, że zawsze jako oś bierzesz lewą skrajną wartość:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 ... 1000

Liczba elementów po prawej stronie osi dla następnego wywołania rekurencyjnego nie będzie już o połowę mniejsza, ale mniejsza o zaledwie jeden skrajny element. To ponownie każdy poziom rekurencji przetwarza n liczb. Ponieważ z kolejnymi wywołaniami ciąg jest o zaledwie jeden element krótszy, będziesz miał wysokość stosu wywołań również równą n (a już nie optymistycznie log n). Ponownie mnożysz O(n) * O(n) i otrzymujesz O(n ^ 2).

By tego uniknąć, jako oś należy wybrać losową wartość z sortowanego ciągu.

0 głosów
odpowiedź 25 października 2021 przez Wiciorny Ekspert (270,170 p.)

Przypadek pesymistyczny występuje wtedy, gdy klucz osiowy za każdym razem znajdzie się na brzegu tabeli. Wówczas przy każdym kolejnym wywołaniu liczba elementów do posortowania jest tylko o 1 mniejsza, zatem funkcja zostanie wywołana n razy. Pesymistyczna złożoność czasowa wynosi zatem O(n2).

- to jest dokładnie co kolega powiedział 

Nalezy pamiętać że Wybór klucza osiowego może być dowolny, jednak powinien być jak najszybszy. W praktyce często stosuje się po prostu wybór pierwszego elementu.
Bo to znacznie obniża efektywność 

Podobne pytania

0 głosów
1 odpowiedź 185 wizyt
pytanie zadane 2 listopada 2022 w Algorytmy przez Fsqwer Nowicjusz (120 p.)
0 głosów
1 odpowiedź 555 wizyt
pytanie zadane 1 listopada 2020 w Algorytmy przez niezalogowany
0 głosów
2 odpowiedzi 383 wizyt
pytanie zadane 5 grudnia 2019 w Algorytmy przez progNewbie Obywatel (1,130 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...