- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
%%% O(n log n)
nub([]) -> [];
nub([H|T]) ->
case lists:member(H, T) of
true ->
nub(T);
false ->
[H|nub(T)]
end.
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+2
%%% O(n log n)
nub([]) -> [];
nub([H|T]) ->
case lists:member(H, T) of
true ->
nub(T);
false ->
[H|nub(T)]
end.
кто-то услышал про логлинейный nub, и решил, что у него тоже получится
но внутри там никакой магии, обычный линейный алгоритм
А есть пример реализации?
Какие ограничения на элементы списка? Они должны быть Ord или достаточно Eq?
реализация: map head . group . sort
Я просто думал, что есть какой-нибудь более изящний divide-and-conquer алгоритм, который ещё и относительный порядок сохраняет.
Практически наверняка в Эрланге найдется куча.
но тут же суть нужно было передать.
этот говнокод меня натолкнул на мысль, что было бы круто специализировать имплементацию в зависимости от констрейнтов типов (к примеру, если есть Ord ебашим логлинейный nub, если только Eq -- квадратичный)
на крестовых концептах и хаскельных closed type families прям руки чешутся оптимизированную библиотеку алгоритмов запилить, которая бы сама за меня все алгебраические свойства операций учитывала