Size: a a a

2019 February 22

ŹR

Źmićer Rubinštejn in pro.elixir
С людьми другой тип сообщений конечно же
источник

ŹR

Źmićer Rubinštejn in pro.elixir
источник

П

Пашок in pro.elixir
Привет, подскажите пожалуйсту куда копать. Пишу реализацию операций над листами, и споткнулся на concat.

@spec concat([[any]]) :: [any]


Почему вот это:
def concat(list), do: list |> reduce([], &append(&2, &1))

очень медленно, а вот это:
def concat(list), do: list |> reverse |> reduce([], &append/2)

очень быстро?
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Пашок
Привет, подскажите пожалуйсту куда копать. Пишу реализацию операций над листами, и споткнулся на concat.

@spec concat([[any]]) :: [any]


Почему вот это:
def concat(list), do: list |> reduce([], &append(&2, &1))

очень медленно, а вот это:
def concat(list), do: list |> reverse |> reduce([], &append/2)

очень быстро?
Посмотри как сделан append
источник

П

Пашок in pro.elixir
append использует ++ и  я чет не могу в сорсах эрланга найти реализацию ++
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Элемент прибавить к массиву О(1)
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А массив к элементу О(n)
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Массив в смысле однонаправленный список
источник

П

Пашок in pro.elixir
Это я в курсе
Вот как написал append

  @spec append(list, list) :: list
 def append([h | t], b), do: [h | append(t, b)]
 def append([], b), do: b
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Так что тебе смущает,если ты все понимаешь?
источник

П

Пашок in pro.elixir
Мне не очень понятна принципиальная разница в том, как написан конкат в сообщении выше, кажется я чет не понимаю то ли в pipe то ли в лямдах
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
Пашок
append использует ++ и  я чет не могу в сорсах эрланга найти реализацию ++
++ - это bif и потому может как угодно оптимироваться разработчиками BeamVM - поэтому там где необходимо складывать 2 листа, предпочтительнее использовать ++.
источник

П

Пашок in pro.elixir
Dmitry Russ (Aleksandrov)
++ - это bif и потому может как угодно оптимироваться разработчиками BeamVM - поэтому там где необходимо складывать 2 листа, предпочтительнее использовать ++.
Это справедливо, но условие задачи – не использовать ++
источник

DR

Dmitry Russ (Aleksandrov) in pro.elixir
А, ок, я думал о чем-то реальном идет речь.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Пашок
Мне не очень понятна принципиальная разница в том, как написан конкат в сообщении выше, кажется я чет не понимаю то ли в pipe то ли в лямдах
В первом случае ты к новому маленькому прибавляешь увеличивающийся результат
источник

ŹR

Źmićer Rubinštejn in pro.elixir
А во втором - к увеличивающемуся результату - маленький новый
источник

П

Пашок in pro.elixir
Ок, понял, пойду закреплю практикой
источник

П

Пашок in pro.elixir
Спасибо!
источник

ŹR

Źmićer Rubinštejn in pro.elixir
append([n1], [n2]) :: O(n1)
источник

П

Пашок in pro.elixir
Źmićer Rubinštejn
append([n1], [n2]) :: O(n1)
Я так понимаю это потому что в эликсире дешевая операция [elem | list] ?
источник