Ce este sortarea somnului?


Cel mai bun răspuns

Sortarea somnului este un algoritm de sortare a glumelor care a devenit popular pe placa 4chan / prog / [1]. Pseudocodul pentru sortarea somnului este:

procedure printNumber(n)

sleep n seconds

print n

end

for arg in args

run printNumber(arg) in background

end

wait for all processes to finish

Ha-ha! Hilarious .

Cu alte cuvinte, ceea ce face este că sortarea somnului generează un proces pentru fiecare argument. Fiecare proces așteaptă n secunde, apoi imprimă n, ceea ce înseamnă că durează 1 secundă pentru a tipări „1”, 2 secunde pentru a imprima scoateți „2”, 100 de secunde pentru a imprima „100”. Aceasta înseamnă că, în cea mai mare parte, numerele sunt tipărite în ordinea mărimii lor, astfel „sortând” argumentele.

Complexitatea acestui algoritm într-o lume perfectă este O(max(args)), deoarece va dura max(args) secunde pentru a imprima cel mai mare arg. În realitate, complexitatea este O(n^2 + max(args)), deoarece menținerea mai multor procese de fundal se bazează pe sistemul de operare pentru a gestiona comutarea contextului și prioritizarea proceselor, astfel algoritmul externalizează practic sortarea reală nucleul.

De asemenea, rețineți că nu există garanții că rezultatul sortării este de fapt corect, o caracteristică pe care majoritatea celorlalți algoritmi de sortare nu o au.

[1] http://dis.4chan.org/read/prog/1295544154

Răspuns

Doar pentru distracție, există implementare în Erlang

sort(L) ->

Parent = self(),

[ spawn\_link(fun() -> receive after X*10 -> Parent ! X end end) || X <- L ],

[ receive X -> X end || \_ <- L ].

Care poate fi scris frumos ca o expresie și în shell-ul Erlang

[ receive X -> X end

|| \_ <- [ spawn\_link(fun() -> receive after X*10 -> P ! X end end)

|| P <- [self()], X <- L ] ].

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *