Complessità delle operazioni di base degli algoritmi di ricerca e ordinamento [chiuso]


8

Wiki ha un buon cheat sheet, ma comunque non implica no. di confronti o swap. (anche se il numero di swap di solito decide la sua complessità). Quindi ho creato quanto segue. Le seguenti informazioni sono corrette? Per favore fatemi sapere se c'è qualche errore, lo correggerò.

Inserimento ordinamento:

  • Caso medio / peggiore: ; accade quando l'input è già ordinato in ordine decrescenteΘ(n2)
  • Best Case: ; quando l'input è già ordinatoΘ(n)
  • Numero di confronti: nel peggiore dei casi & nel migliore dei casiΘ(n2)Θ(n)
  • Numero di swap: nel caso peggiore / medio e nel migliore dei casiΘ(n2)0

Selezione ordinamento:

  • Caso medio / Peggior caso / migliore caso:Θ(n2)
  • Numero di confronti:Θ(n2)
  • Numero di scambi: nel caso peggiore / medio e nel migliore dei casi Al massimo l'algoritmo richiede N scambi, una volta scambiato un elemento in posizione, non lo toccherai mai più.Θ(n)0

Unisci ordinamento:

  • Caso medio / Peggior caso / migliore caso: ; non importa affatto se l'input è ordinato o menoΘ(nlgn)
  • Numero di confronti: nel peggiore dei casi & nel migliore dei casi; supponendo che stiamo unendo due array di dimensioni n & m doveΘ(n+m)Θ(n)n<m
  • Numero di swap: nessuno swap! [ma richiede memoria aggiuntiva, non ordinamento sul posto]

Ordinamento rapido:

  • Peggiore caso: ; succede che l'ingresso è già ordinatoΘ(n2)
  • Best Case: ; quando pivot divide l'array esattamente a metàΘ(nlogn)
  • Numero di confronti: nel peggiore dei casi & nel migliore dei casiΘ(n2)Θ(nlogn)
  • Numero di swap: nel peggiore dei casi e nel migliore dei casiΘ(n2)0

Ordinamento bolle:

  • Peggiore caso:Θ(n2)
  • Best Case: ; su già ordinatoΘ(n)
  • Numero di confronti: nel caso peggiore e nel caso miglioreΘ(n2)
  • Numero di swap: nel peggiore dei casi e nel migliore dei casiΘ(n2)0

Ricerca lineare:

  • Peggiore caso: ; chiave di ricerca non presente o ultimo elementoΘ(n)
  • Best Case: ; primo elementoΘ(1)
  • Numero di confronti: nel peggiore dei casi e nel migliore dei casiΘ(n)1

Ricerca binaria:

  • Caso peggiore / caso medio:Θ(logn)
  • Best Case: ; quando la chiave è l'elemento centraleΘ(1)
  • Numero di confronti: nel caso peggiore / medio e nel migliore dei casiΘ(logn)1

  1. Ho considerato solo algoritmi di ricerca e ordinamento di base.
  2. Si presume in precedenza che gli algoritmi di ordinamento producano un output in ordine crescente
  3. Fonti: il fantastico CLRS e questo Wiki

Per discutere i meriti di questa (sorta di) domanda, si prega di unirsi a noi in chat .
Raffaello

1
Questa non è una domanda, quindi è fuori tema.
David Richerby,

Ho votato anche per chiudere. Questo è forse difficile da salvare anche perché la "domanda" è piuttosto ampia (quali sono esattamente gli algoritmi di ricerca e ordinamento di base?)
Juho

Risposte:


-2

Per l'algoritmo generale del caso peggiore, i confronti nel caso peggiore sono Ma per l'algoritmo del caso speciale in cui si aggiunge un flag per indicare che c'è stato uno scambio nel passaggio precedente. Se non ci fossero scambi, usciremo dal ciclo poiché l'array è già ordinato. In questo caso i confronti non sono . 0.Θ(n2)n

Per l'ordinamento rapido hai menzionato che gli swap nel caso peggiore sono . Lo scenario peggiore per l'ordinamento rapido è quando tutti gli elementi sono in ordine, quindi non ci saranno scambi quindi dovrebbe essere zero.n2


1
Non capisco la tua risposta. Rilevare "no swap" nell'ordinamento a bolle lo rende certamente più veloce ma, se l'input è nell'ordine opposto a quello dell'output, sono ancora necessari gli swap , anche con il rilevamento "no swap". Quicksort normalmente funziona nel tempo quindi il caso migliore non può essere swap. Θ(n2)O(nlogn)n2
David Richerby,

Grazie per aver modificato il mio commento, sono nuovo di SE. Beh, avrei dovuto essere più chiaro su questo. ho appena modificato il mio commento sopra. Stavo cercando di dire che i confronti dei casi migliori non possono essere 0 in caso di ordinamento Bubble che deve n. quando l'array è ordinato e si sta usando flag per indicare lo scambio nel passaggio precedente. se non vi sono scambi nel passaggio precedente, l'array è già ordinato, quindi non è necessario eseguire ulteriori passaggi per il primo passaggio, stiamo effettuando n confronti. Per l'ordinamento rapido sto parlando di confronti e scambi non di complessità temporale, in caso peggiore tutti gli elementi sono ordinati, quindi non sono necessari scambi.
Nikhil Mahajan,

Nel caso normale, quicksort viene eseguito nel tempo . Pertanto, il caso migliore è anche intervalli di tempo (potrebbe essere più veloce ma fornisce solo un limite superiore). Nei passaggi , non puoi fare nulla volte - confronti, scambi o altro. Non è possibile utilizzare più di memoria, neanche. Il caso migliore per qualsiasi misura di complessità non può essere più di . O(nlogn)O(nlogn)O()O(nlogn)n2O(nlogn)O(nlogn)
David Richerby,

Hai ragione, ho modificato la mia risposta per l'ordinamento rapido.
Nikhil Mahajan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.