Ordinamento in informatica e ordinamento nel mondo "reale"


87

Stavo pensando agli algoritmi di ordinamento nel software e ai modi possibili per superare il O(nlogn)blocco stradale. Non credo che sia possibile ordinare più velocemente in senso pratico, quindi per favore non pensare che lo faccia.

Detto questo, sembra che con quasi tutti gli algoritmi di ordinamento, il software debba conoscere la posizione di ogni elemento. Il che ha senso, altrimenti, come saprebbe dove posizionare ogni elemento secondo alcuni criteri di ordinamento?

Ma quando ho incrociato questo pensiero con il mondo reale, una centrifuga non ha idea in quale posizione si trovi ogni molecola quando "ordina" le molecole in base alla densità. In effetti, non si preoccupa della posizione di ogni molecola. Tuttavia può ordinare trilioni su trilioni di oggetti in un periodo di tempo relativamente breve, a causa del fatto che ogni molecola segue le leggi di densità e gravitazionali, il che mi ha fatto pensare.

Sarebbe possibile con un po 'di overhead su ogni nodo (un valore o un metodo applicato a ciascuno dei nodi) per "forzare" l'ordine della lista? Qualcosa come una centrifuga, dove solo ogni elemento si preoccupa della sua posizione relativa nello spazio (in relazione ad altri nodi). Oppure questo viola qualche regola nel calcolo?

Penso che uno dei grandi punti sollevati qui sia gli effetti della meccanica quantistica della natura e il modo in cui si applicano in parallelo a tutte le particelle simultaneamente.

Forse i computer classici limitano intrinsecamente l'ordinamento al dominio di O(nlogn), dove i computer quantistici possono essere in grado di attraversare quella soglia in O(logn)algoritmi che agiscono in parallelo.

Il punto per cui una centrifuga è fondamentalmente un ordinamento a bolle parallele sembra essere corretto, il che ha una complessità temporale di O(n).

Immagino che il pensiero successivo sia che se la natura può ordinare O(n), perché non possono i computer?


44
Centrifuge è solo un'implementazione di bubble sort massicciamente parallela, niente di speciale.
el.pescado

3
Quando si dispone di nprocessori (core) per ordinare una serie di soli nelementi, è possibile ottenere facilmente O(n)complessità. Un'amara verità è che di solito dobbiamo ordinare lunghi array (migliaia e milioni di elementi) su CPU con solo 2..10 core.
Dmitry Bychenko

24
Si noti che n log n è il numero di confronti che devono essere effettuati in un ordinamento che confronta coppie di elementi . Non è necessario che un algoritmo di ordinamento confronti coppie di elementi ; se riesci a trovare un ordinamento che non esegue confronti a coppie, puoi renderlo più veloce di n log n.
Eric Lippert

7
La cosa che ti manca è che ciascuna di quelle molecole nella soluzione sono unità di elaborazione. Non esiste un emulatore che conti le molecole: le molecole si contano da sole. Un computer analogo avrebbe tanti core del processore e memorie indipendenti quanti sono gli elementi da ordinare. O(n)di per sé non ti dice nulla - è utile solo per confrontare algoritmi con vincoli simili e funzionare su architetture simili; nei corsi introduttivi alla complessità algoritmica utilizziamo un modello "computer" molto semplificato che ha poco a che fare con centrifughe o computer reali :)
Luaan

4
Voto per chiudere questa domanda come fuori tema perché appartiene a cs.stackexchange.com
Robert Fraser

Risposte:


71

EDIT: Avevo frainteso il meccanismo di una centrifuga e sembra che faccia un confronto, in modo massicciamente parallelo. Tuttavia ci sono processi fisici che operano su una proprietà dell'entità che viene ordinata piuttosto che confrontare due proprietà. Questa risposta copre algoritmi di quella natura.

Una centrifuga applica un meccanismo di smistamento che non funziona realmente per mezzo di confronti tra elementi, ma in realtà per una proprietà ("forza centrifuga") su ogni singolo elemento in isolamento. Alcuni algoritmi di ordinamento rientrano in questo tema, in particolare Radix Sort . Quando questo algoritmo di ordinamento è parallelizzato, dovrebbe avvicinarsi all'esempio di una centrifuga.

Alcuni altri algoritmi di ordinamento non comparativo sono Bucket sort e Counting Sort . Potresti scoprire che l'ordinamento del secchio si adatta anche all'idea generale di una centrifuga (il raggio potrebbe corrispondere a un bidone).

Un altro cosiddetto "algoritmo di ordinamento" in cui ogni elemento viene considerato isolatamente è lo Sleep Sort . Qui il tempo, piuttosto che la forza centrifuga, funge da grandezza utilizzata per lo smistamento.


Questa è in realtà la risposta giusta: bin sorting / radix sorting ha una complessità O (n) purché sia ​​possibile accedere a bin e input in tempo O (1).
pjc50

5
Stavo per chiedere "Qualcun altro pensa subito a Sleep Sort?".
Apparentemente

Le centrifughe funzionano confrontando gli elementi; la funzione hash è (principalmente) densità. Ad esempio, se centrifugi una miscela di propano e aria, otterrai il propano smistato ai confini; ma se centrifugi propano e acqua, otterrai il propano smistato al centro (l'acqua è più densa). Questo processo è quasi esattamente lo stesso del processo fisico da cui prende il nome un "bubble sort".
Nat,

La complessità di SleepSort non dipende effettivamente da quella dello scheduler?
Morwenn

@ Morwenn il vecchio scheduler di Linux era O (1) mentre quello nuovo è O (log n). Entrambi sono controbilanciati dai fattori costanti del sonno
utente1952500

35

La complessità computazionale è sempre definita rispetto a qualche modello computazionale. Ad esempio, un algoritmo che è O ( n ) su un tipico computer potrebbe essere O (2 n ) se implementato in Brainfuck .

Il modello computazionale della centrifuga ha alcune proprietà interessanti; per esempio:

  • supporta il parallelismo arbitrario; indipendentemente dal numero di particelle presenti nella soluzione, possono essere ordinate tutte contemporaneamente.
  • non fornisce un tipo lineare stretto di particelle in massa, ma piuttosto un'approssimazione molto vicina (a bassa energia).
  • non è possibile esaminare le singole particelle nel risultato.
  • non è possibile ordinare le particelle in base a proprietà diverse; è supportata solo la massa.

Dato che non abbiamo la capacità di implementare qualcosa di simile in hardware informatico generico, il modello potrebbe non avere rilevanza pratica; ma può ancora valere la pena esaminarlo, per vedere se c'è qualcosa da imparare da esso. Gli algoritmi non deterministici e gli algoritmi quantistici sono stati entrambi aree di ricerca attive, ad esempio, anche se nessuno dei due è attualmente implementabile.


Natura / fisica sono parallele in generale (ecco perché è così costoso dal punto di vista computazionale da simulare sui nostri computer seriali), quindi sì, l'analogia dell'OP ha un grosso difetto. Tuttavia, ci vuole ancora tempo perché particelle / molecole si muovano lungo la lunghezza di una provetta o qualsiasi altra cosa, quindi una provetta più lunga è come più lavoro per filo, ma una provetta più ampia è più parallelismo. (E nota che una centrifuga non ordina attraverso l'area di una provetta, quindi sono molti tipi paralleli senza fusione ma forse qualche interazione lungo il percorso. A differenza di un ordinamento reale su un computer parallelo, con fusione finale)
Peter Cordes

29

Il trucco sta nel fatto che hai solo la possibilità di ordinare la tua lista usando una centrifuga. Come con altri ordinamenti del mondo reale [citazione necessaria], puoi modificare la probabilità di aver ordinato l'elenco, ma non esserne mai certo senza controllare tutti i valori (atomi).

Considera la domanda: "Per quanto tempo dovresti far funzionare la tua centrifuga?"
Se lo hai eseguito solo per un picosecondo, il tuo campione potrebbe essere meno ordinato rispetto allo stato iniziale .. oppure se lo hai eseguito per pochi giorni, potrebbe essere completamente ordinato. Tuttavia, non lo sapresti senza controllare effettivamente i contenuti.


Questo è un punto abbastanza positivo. Come lo sai? Poi di nuovo, se le regole in vigore sono abbastanza valide, ti interesserebbe anche saperlo? (cioè se rendi la probabilità così bassa da diventare trascurabile).
Kris

Puoi sempre calcolare quanto tempo impiegherebbe una particella a raggiungere la fine della centrifuga. Conosci l'accelerazione (w ^ 2 * r dove w è la velocità angolare) e puoi calcolare il tempo.
user1952500

1
Vero, ma poiché questo è confuso dal moto browniano , da altre forze atomiche e dalla fisica quantistica (grazie, piccole cose!), Non puoi ancora essere completamente certo di aver ordinato la tua lista finché non controlli lo stato.
ti7

1
Se non hai particelle estremamente piccole, puoi ignorare gli effetti quantistici. Se hai particelle estremamente piccole, l'algoritmo di ordinamento non deve funzionare e, in effetti, non puoi dipendere da esso per funzionare a causa degli effetti quantistici. Inoltre, non è possibile controllare lo stato in modo affidabile a causa del principio di indeterminazione (il controllo di una particella farà muovere altre particelle).
user1952500

1
@Kris Beh, sappiamo che la centrifuga non si ordina perfettamente. Continuiamo a farlo finché la differenza non è più importante per lo scopo pratico, come prevenire la coagulazione del sangue nella centrifuga del sangue. Ma guarda le centrifughe all'uranio: quelle hanno bisogno di smistare oggetti che sono molto "più vicini" (più difficili da separare) e richiedono una struttura enorme che continui a smistare ancora e ancora e ancora a spese enormi per produrre piccole quantità del materiale desiderato. E la centrifuga ha una certa dimensione e il tempo di separazione è proporzionale alla larghezza dei tubi, e ... Non puoi semplicemente dire O (n), yay!
Luaan

5

Un esempio del mondo reale di un "ordinamento" basato su computer sarebbe droni autonomi che lavorano in cooperazione tra loro, noti come "sciami di droni". I droni agiscono e comunicano sia come individui che come gruppo e possono tracciare più bersagli. I droni decidono collettivamente quali droni seguiranno quali obiettivi e l'evidente necessità di evitare collisioni tra droni. Le prime versioni di questo erano droni che si muovevano attraverso punti di passaggio rimanendo in formazione, ma la formazione potrebbe cambiare.

Per un "ordinamento", i droni potrebbero essere programmati per formare una linea o uno schema in un ordine specifico, inizialmente rilasciato in qualsiasi permutazione o forma, e collettivamente e in parallelo formerebbero rapidamente la linea o lo schema ordinato.

Tornando a un ordinamento basato su computer, un problema è che c'è un bus di memoria principale e non c'è modo per un gran numero di oggetti di spostarsi nella memoria in parallelo.

conoscere la posizione di ogni elemento

Nel caso di un ordinamento nastro, la posizione di ciascun elemento (record) è "nota" solo al "nastro", non al computer. Un ordinamento basato su nastro deve funzionare solo con due elementi alla volta e un modo per indicare i limiti di esecuzione su un nastro (contrassegno di file o un record di dimensioni diverse).


4

IMHO, le persone pensano troppo a log (n). O (nlog (n)) È praticamente O (n). E hai bisogno di O (n) solo per leggere i dati.

Molti algoritmi come Quicksort forniscono un modo molto veloce per ordinare gli elementi. Potresti implementare varianti di quicksort che sarebbero molto veloci in pratica.

Intrinsecamente tutti i sistemi fisici sono infinitamente paralleli. Potresti avere un mucchio di atomi in un granello di sabbia, la natura ha abbastanza potenza di calcolo per capire dove dovrebbe essere ogni elettrone in ogni atomo. Quindi, se avessi abbastanza risorse di calcolo (O (n) processori) potresti ordinare n numeri in tempo log (n).

Dai commenti:

  1. Dato un processore fisico che ha un numero k di elementi, può raggiungere una parallelità al massimo O (k). Se elabori n numeri arbitrariamente, lo elaborerebbe comunque a una velocità correlata a k. Inoltre, potresti formulare questo problema fisicamente. Potresti creare n sfere d'acciaio con pesi proporzionali al numero che vuoi codificare, il che potrebbe essere risolto da una centrifuga in teoria. Ma qui la quantità di atomi che stai usando è proporzionale a n. Considerando che in un caso standard hai un numero limitato di atomi in un processore.

  2. Un altro modo per pensare a questo è, supponiamo che tu abbia un piccolo processore collegato a ciascun numero e ogni processore possa comunicare con i suoi vicini, potresti ordinare tutti quei numeri in tempo O (log (n)).


Ma il calcolo non è solo questo: usare le proprietà fisiche della natura per fare un po 'di lavoro? Potrei passare al calcolo quantistico qui, ma se può essere fatto fisicamente, dovrebbe essere in grado di essere fatto computazionalmente? Forse il calcolo classico è il blocco stradale tra O (nlogn) e O (logn).
Kris

2
@Kris Non esattamente. Dato un processore fisico che ha un numero k di elementi, può raggiungere una parallelità al massimo O (k). Se elabori n numeri arbitrariamente, lo elaborerebbe comunque a una velocità correlata a k. Inoltre, potresti formulare questo problema fisicamente. Potresti creare n sfere d'acciaio con pesi proporzionali al numero che vuoi codificare, il che potrebbe essere risolto da una centrifuga in teoria. Ma qui la quantità di atomi che stai usando è proporzionale a n. Considerando che in un caso standard hai un numero limitato di atomi in un processore.
ElKamina

Questo limite si applica anche agli oggetti QM? Solo per curiosità
Kris

1
@Kris Non capisco QM abbastanza in profondità per rispondere.
ElKamina

Nessun problema! Sono solo molto curioso e non riesco a dormire haha. Grazie per le interessanti risposte.
Kris

4

Ho lavorato in un ufficio le estati dopo il liceo quando ho iniziato il college. Avevo studiato in AP Computer Science, tra le altre cose, ordinamento e ricerca .

Ho applicato questa conoscenza in diversi sistemi fisici che posso ricordare:

Ordinamento di unione naturale per iniziare ...

Un sistema stampava moduli in più parti, incluso uno strappo delle dimensioni di una scheda, che doveva essere archiviato in una banca di cassetti.

Ho iniziato con una pila di loro e ho ordinato la pila per cominciare. Il primo passo è raccogliere 5 o giù di lì, pochi abbastanza da essere facilmente posizionati in ordine nella tua mano. Posiziona il pacchetto ordinato verso il basso, incrociando ogni pila per tenerli separati.

Quindi, unisci ogni coppia di pile, producendo una pila più grande. Ripeti finché non c'è solo una pila.

... Ordinamento di inserzione da completare

È più facile archiviare le carte ordinate, poiché ciascuna successiva si trova un po 'più in basso nello stesso cassetto aperto.

Ordinamento radice

Questo nessun altro ha capito come l'ho fatto così velocemente, nonostante i ripetuti tentativi di insegnarlo.

È necessario ordinare una grande scatola di matrici di assegni (delle dimensioni di schede perforate). Sembra come giocare a un solitario su un grande tavolo: distribuisci, impila, ripeti.

In generale

30 anni fa, ho notato quello che stai chiedendo: le idee vengono trasferite ai sistemi fisici in modo abbastanza diretto perché ci sono costi relativi di confronto e gestione dei record e livelli di memorizzazione nella cache.

Andare oltre gli equivalenti ben compresi

Ricordo un saggio sul tuo argomento, e ha tirato fuori la specie di spaghetti . Taglia un pezzo di pasta secca per indicare il valore chiave e etichettalo con l'ID record. Questo è O (n), elabora semplicemente ogni elemento una volta.

Quindi prendi il pacchetto e ne picchietti un'estremità sul tavolo. Si allineano sui bordi inferiori e ora sono ordinati. Puoi banalmente togliere quello più lungo e ripetere. Anche la lettura è O (n).

Ci sono due cose che accadono qui nel "mondo reale" che non corrispondono agli algoritmi. Innanzitutto, l'allineamento dei bordi è un'operazione parallela. Ogni elemento di dati è anche un processore (le leggi della fisica si applicano ad esso). Quindi, in generale, ridimensionate l'elaborazione disponibile con n, essenzialmente dividendo la vostra complessità classica per un fattore su n.

Secondo, in che modo l'allineamento dei bordi realizza un ordinamento? Il vero ordinamento è nella lettura che ti consente di trovare il più lungo in un unico passaggio, anche se li hai confrontati tutti per trovare il più lungo. Ancora una volta, dividi per un fattore n, quindi trovare il più grande è ora O (1).

Un altro esempio è l'utilizzo del calcolo analogico: un modello fisico risolve il problema "istantaneamente" e il lavoro di preparazione è O (n). In linea di principio il calcolo sta scalando in base al numero di componenti interagenti, non al numero di elementi preparati. Quindi il calcolo scala con n². L'esempio a cui sto pensando è un calcolo multifattoriale ponderato, che è stato eseguito perforando una mappa, appendendo pesi alle corde che passano attraverso i fori e raccogliendo tutte le corde su un anello.


La specie di spaghetti è stata una lettura divertente. Mi è piaciuto pensarci, ma critico l'azione di scansionare il noodle più lungo. Questa non è realmente un'operazione O (1) poiché scansiona i noodles. Immagina diecimila noodles e alcuni di lunghezza simile ... non è un'operazione "eyeball it" O (1). In realtà, bisogna scansionare tutti gli spaghetti non ordinati per trovare il più lungo.
ThisClark

Puoi "scansionare" tutti i noodles appoggiando il palmo su tutto il mazzo e tirando via il noodle più alto che viene a contatto con la tua mano. Se le tagliatelle sono molto ravvicinate, usa una superficie più precisa per "mano" per afferrare la tagliatella più alta. I noodles non sono selezionati in serie come con un ordinamento di selezione, sono selezionati tutti in una volta quindi c'è O (n) potenza di "calcolo" disponibile.
Bradd Szonye

1
@ThisClark ti serve una maschera più precisa: un piano piatto parallelo allo stop sul fondo che allinea i noodles. Abbassalo con cautela fino a toccare un noodle (il più alto) e metterlo sotto compressione. Il confronto tra l'altezza dell'aereo e ogni tagliatella viene fatto parallelamente da quella tagliatella. Stai suggerendo che è necessario un coefficiente più alto, ma questo argomento non cambia il Big-O.
JDługosz

3

L'ordinamento è ancora O (n) tempo totale. Che è più veloce di così è a causa della parallelizzazione .

È possibile visualizzare una centrifuga come un Bucketsort di n atomi, parallelizzato su n core (ogni atomo funge da processore).

È possibile velocizzare l'ordinamento per parallelizzazione ma solo per un fattore costante perché il numero di processori è limitato, O (n / C) è ancora O (n) (le CPU hanno solitamente <10 core e GPU <6000)


2

La centrifuga non sta smistando i nodi, applica una forza su di essi, quindi reagiscono parallelamente ad essa. Quindi, se dovessi implementare un bubble sort in cui ogni nodo si muove parallelamente verso l'alto o verso il basso in base alla sua "densità", avresti un'implementazione centrifuga.

Tieni presente che nel mondo reale puoi eseguire una quantità molto grande di attività parallele in cui in un computer puoi avere un massimo di attività parallele reali pari al numero di unità di elaborazione fisiche.

Alla fine, saresti anche limitato con l'accesso all'elenco degli elementi perché non può essere modificato contemporaneamente da due nodi ...


1

Sarebbe possibile con un po 'di overhead su ogni nodo (un valore o un metodo applicato a ciascuno dei nodi) per "forzare" l'ordine della lista?

Quando ordiniamo utilizzando programmi per computer, selezioniamo una proprietà dei valori da ordinare. Questa è comunemente la grandezza del numero o l'ordine alfabetico.

Qualcosa come una centrifuga, in cui solo ogni elemento si preoccupa della sua posizione relativa nello spazio (in relazione ad altri nodi)

Questa analogia mi ricorda giustamente il semplice bubble sort. In che modo i numeri più piccoli emergono in ogni iterazione. Come la logica della tua centrifuga.

Quindi, per rispondere a questa domanda, non facciamo davvero qualcosa del genere nell'ordinamento basato su software?


1
Penso tu abbia ragione. Penso che ho perso la mia analogia qui è che ho dimenticato che ogni molecola agisce in parallelo. Quindi, sarebbe come una sorta di bolla parallela ...
Kris

1

Prima di tutto, stai confrontando due contesti diversi, uno è la logica (computer) e l'altro è la fisica che (finora) è dimostrato che possiamo modellarne alcune parti usando formule matematiche e noi come programmatori possiamo usare queste formule per simulare (alcune parti della) fisica nella logica funzionano (es. motore fisico nel motore di gioco).

Secondo Abbiamo alcune possibilità nel mondo dei computer (logica) che sono quasi impossibili in fisica, ad esempio possiamo accedere alla memoria e trovare la posizione esatta di ogni entità in ogni momento, ma in fisica questo è un enorme problema per il principio di indeterminazione di Heisenberg .

Terzo Se vuoi mappare le centrifughe e il suo funzionamento nel mondo reale, nel mondo dei computer, è come se qualcuno (The God) ti avesse dato un super-computer con tutte le regole della fisica applicate e tu ci stessi facendo il tuo piccolo smistamento ( using centrifuge) e dicendo che il tuo problema di smistamento è stato risolto in o (n) stai ignorando l'enorme simulazione fisica in corso in background ...


0

Un'altra prospettiva è che quello che stai descrivendo con la centrifuga è analogo a quello che è stato chiamato "spaghetti sort" ( https://en.wikipedia.org/wiki/Spaghetti_sort ). Supponiamo che tu abbia una scatola di bastoncini di spaghetti crudi di varie lunghezze. Tienili in pugno e allenta la mano per abbassarli verticalmente in modo che le estremità poggino tutte su un tavolo orizzontale. Boom! Sono ordinati per altezza. O (costante) tempo. (O O (n) se includi il prelievo delle canne in base all'altezza e il loro inserimento in una ... griglia per spaghetti, immagino?)

Puoi notare che è O (costante) nel numero di pezzi di spaghetti, ma, a causa della velocità finita del suono negli spaghetti, è O (n) nella lunghezza del filo più lungo. Quindi niente è gratis.


È la stessa cosa che ho detto 11 ore prima. E ho continuato spiegando come i sistemi fisici ti permettono di dividere per no per n² e mantenere il modello di algoritmi e calcolo.
JDługosz

0

Considera: la "selezione centrifuga" è davvero migliore? Pensa a cosa succede mentre esegui la scalata.

  • Le provette devono diventare sempre più lunghe.
  • Le cose pesanti devono viaggiare sempre più lontano per arrivare al fondo.
  • Il momento di inerzia aumenta, richiedendo più potenza e tempi più lunghi per accelerare fino alla velocità di smistamento.

Vale anche la pena considerare altri problemi con l'ordinamento centrifugo. Ad esempio, puoi operare solo su una scala di dimensioni ridotte. Un algoritmo di ordinamento del computer può gestire numeri interi da 1 a 2 ^ 1024 e oltre, senza fatica. Metti qualcosa che pesa 2 ^ 1024 volte quanto un atomo di idrogeno in una centrifuga e, beh, quello è un buco nero e la galassia è stata distrutta. L'algoritmo non è riuscito.

Ovviamente la vera risposta qui è che la complessità computazionale è relativa a qualche modello computazionale, come menzionato in un'altra risposta. E "centrifuge sort" non ha senso nel contesto di modelli computazionali comuni, come il modello RAM o il modello IO o macchine di Turing multitape.

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.