Che cos'è un buon algoritmo di ordinamento per casi speciali?


13

Ho un set di dati che è un numero di oggetti disposti in una griglia 2D. So di avere un ordinamento rigoroso, aumentando man mano che vai da sinistra a destra all'interno di ogni riga e aumentando dall'alto verso il basso all'interno di ogni colonna. Per esempio,

  • 1 2 3
  • 4 6 7
  • 5 8 9

Posso migliorare l'ordinamento ingenuo per ordinare l'intero set di dati in modo lineare (come misurato nei confronti)?

Che dire di nd set di dati? Set di dati finiti arbitrari con un sottoinsieme di confronti noti?


1
Puoi fare una domanda più precisa? Il tuo primo paragrafo può essere letto per indicare che i tuoi dati sono già ordinati! Qual è esattamente il tuo input e quale output desideri?
Jacques Carette,

1
Sì, la lingua è un po 'confusa. Mi ci è voluto un po 'di tempo per capire che il set di dati è composto da n numeri da ordinare ma questi numeri sono disposti in una griglia sqrt (n) x sqrt (n) in modo tale che ogni riga e ogni colonna siano già ordinate. È quello che volevi dire?

Sì, questo è ciò che intendevo. Modificherò per chiarezza.
Zachary Vance,

Risposte:


19

È facile dimostrare un limite inferiore di Ω (n 2 log n) su questo problema (nel modello di ordinamento di confronto): se l'elemento in posizione (i, j) è sempre alla distanza 1/2 di i + j, allora la griglia le diagonali sono indipendenti l'una dall'altra e l'ordine ordinato all'interno di ciascuna diagonale della griglia è arbitrario. Quindi sotto questo vincolo il numero totale di ordini possibili è il prodotto (su tutte le diagonali della griglia) dei fattoriali delle lunghezze delle diagonali, che è esponenziale in n 2 log n.

Vale a dire che gli algoritmi di ordinamento di confronto standard sono asintoticamente ottimali per le griglie ordinate come descritto.


L'altra risposta fornisce un algoritmo esplicito con questa complessità, quindi prenderò in considerazione questo problema risolto per le griglie 2D e, senza effettivamente verificare, probabilmente per le griglie dimensionali arbitrarie.
Zachary Vance,

4

Se capisco correttamente il problema (e forse no, sentiti libero di dirmi se non lo faccio) vuoi trasformare una griglia 2D in un array 1D ordinato, mentre ogni riga e colonna è già ordinata nella griglia 2D?

Il primo elemento nell'elenco in questo caso deve essere l'angolo in alto a sinistra ((0,0), per definizione del problema). Dopodiché deve essere l'elemento (1,0) o (0,1), poiché tutti gli altri saranno più grandi di questi per definizione.

Puoi generalizzare dicendo che il prossimo elemento più piccolo nella griglia è sempre direttamente sotto un elemento già usato (o il bordo della griglia), e anche a destra di un elemento già usato (o il bordo della griglia), poiché entrambi sono definito per essere più piccolo di esso. Quindi ad ogni iterazione devi considerare solo il valore più piccolo che soddisfa questo requisito.

È possibile mantenere i possibili candidati in modo ordinato come li si trova (non più di due saranno mai resi disponibili in una iterazione) e ad ogni iterazione controllare i nuovi valori resi disponibili (se presenti). Se sono inferiori al più basso dei precedenti candidati, aggiungili immediatamente all'elenco e ripeti, altrimenti aggiungi il precedente candidato più basso e confronta con il successivo più basso, ecc.

Sfortunatamente non pretendo di essere in grado di fornire un'esatta complessità di questo, né pretendo che sia il più efficiente possibile, sembra certamente migliore di un approccio ingenuo e spero di averlo spiegato abbastanza bene da capirlo.

EDIT: per nd griglie come questa credo che si applichi lo stesso principio di base, ma ogni iterazione rende disponibili fino a n nuovi candidati e questi candidati devono essere gli elementi inutilizzati più piccoli in ciascuna delle n dimensioni a questo punto.


In breve, puoi fare una fusione sqrt (N) -way, come in mergesort? Questo è stato il mio metodo migliore in esecuzione, ma risulta essere O (N log N) - Non ho una costante esatta lì, ma c'è almeno 0,5 per log (sqrt (N)).
Zachary Vance,
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.