Longest increasing subsequence: Difference between revisions
Content added Content deleted
m (Added Sidef) |
(Added Elixir) |
||
Line 412: | Line 412: | ||
<pre>[ 2 4 5 ] |
<pre>[ 2 4 5 ] |
||
[ 0 2 6 9 11 15 ]</pre> |
[ 0 2 6 9 11 15 ]</pre> |
||
=={{header|Elixir}}== |
|||
{{trans|Erlang}} |
|||
===Naive version=== |
|||
very slow |
|||
<lang elixir>defmodule Longest_increasing_subsequence do |
|||
# Naive implementation |
|||
def lis(l) do |
|||
(for ss <- combos(l), ss == Enum.sort(ss), do: ss) |
|||
|> Enum.max_by(fn ss -> length(ss) end) |
|||
end |
|||
defp combos(l) do |
|||
Enum.reduce(1..length(l), [[]], fn k, acc -> acc ++ (combos(k, l)) end) |
|||
end |
|||
defp combos(1, l), do: (for x <- l, do: [x]) |
|||
defp combos(k, l) when k == length(l), do: [l] |
|||
defp combos(k, [h|t]) do |
|||
(for subcombos <- combos(k-1, t), do: [h | subcombos]) ++ combos(k, t) |
|||
end |
|||
end |
|||
IO.inspect Longest_increasing_subsequence.lis([3,2,6,4,5,1]) |
|||
IO.inspect Longest_increasing_subsequence.lis([0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15])</lang> |
|||
{{out}} |
|||
<pre> |
|||
[3, 4, 5] |
|||
[0, 4, 6, 9, 13, 15] |
|||
</pre> |
|||
===Patience sort version=== |
|||
<lang elixir>defmodule Longest_increasing_subsequence do |
|||
# Patience sort implementation |
|||
def patience_lis(l), do: patience_lis(l, []) |
|||
defp patience_lis([h | t], []), do: patience_lis(t, [[{h,[]}]]) |
|||
defp patience_lis([h | t], stacks), do: patience_lis(t, place_in_stack(h, stacks, [])) |
|||
defp patience_lis([], []), do: [] |
|||
defp patience_lis([], stacks), do: get_previous(stacks) |> recover_lis |> Enum.reverse |
|||
defp place_in_stack(e, [stack = [{h,_} | _] | tstacks], prevstacks) when h > e do |
|||
prevstacks ++ [[{e, get_previous(prevstacks)} | stack] | tstacks] |
|||
end |
|||
defp place_in_stack(e, [stack | tstacks], prevstacks) do |
|||
place_in_stack(e, tstacks, prevstacks ++ [stack]) |
|||
end |
|||
defp place_in_stack(e, [], prevstacks) do |
|||
prevstacks ++ [[{e, get_previous(prevstacks)}]] |
|||
end |
|||
defp get_previous(stack = [_|_]), do: hd(List.last(stack)) |
|||
defp get_previous([]), do: [] |
|||
defp recover_lis({e, prev}), do: [e | recover_lis(prev)] |
|||
defp recover_lis([]), do: [] |
|||
end |
|||
IO.inspect Longest_increasing_subsequence.patience_lis([3,2,6,4,5,1]) |
|||
IO.inspect Longest_increasing_subsequence.patience_lis([0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15])</lang> |
|||
{{out}} |
|||
<pre> |
|||
[2, 4, 5] |
|||
[0, 2, 6, 9, 11, 15] |
|||
</pre> |
|||
=={{header|Erlang}}== |
=={{header|Erlang}}== |
||
Line 822: | Line 888: | ||
[ 2, 4, 5 ] |
[ 2, 4, 5 ] |
||
</pre> |
</pre> |
||
=={{header|jq}}== |
=={{header|jq}}== |
||
Line 1,499: | Line 1,563: | ||
<pre>[2, 4, 5] |
<pre>[2, 4, 5] |
||
[0, 2, 6, 9, 11, 15]</pre> |
[0, 2, 6, 9, 11, 15]</pre> |
||
=={{header|Scala}}== |
=={{header|Scala}}== |
||
<lang Scala>object LongestIncreasingSubsequence extends App { |
<lang Scala>object LongestIncreasingSubsequence extends App { |