Longest increasing subsequence: Difference between revisions

Added Easylang
(Added Easylang)
 
(5 intermediate revisions by 5 users not shown)
Line 18:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F longest_increasing_subsequence(x)
V n = x.len
V P = [0] * n
Line 47:
 
L(d) [[3, 2, 6, 4, 5, 1], [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]
print(‘a L.I.S. of #. is #.’.format(d, longest_increasing_subsequence(d)))</langsyntaxhighlight>
 
{{out}}
Line 57:
=={{header|360 Assembly}}==
{{trans|VBScript}}
<langsyntaxhighlight lang="360asm">* Longest increasing subsequence 04/03/2017
LNGINSQ CSECT
USING LNGINSQ,R13 base register
Line 177:
XDEC DS CL12 temp for xdeco
YREGS
END LNGINSQ</langsyntaxhighlight>
{{out}}
<pre>
Line 189:
{{Trans|Phix}} … modified to return ''multiple'' co-longest sequences where found. It's not clear how equal values should be treated. Here the behaviour happens to be as in the demo code at the end.
 
<langsyntaxhighlight lang="applescript">on longestIncreasingSubsequences(aList)
script o
property inputList : aList
Line 251:
set end of output to {finds:longestIncreasingSubsequences(input's contents)}
end repeat
return output</langsyntaxhighlight>
 
{{output}}
<langsyntaxhighlight lang="applescript">{{finds:{{2, 4, 5}}}, {finds:{{0, 2, 6, 9, 11, 15}}}, {finds:{{9, 10, 11}, {3, 8, 9}, {3, 6, 7}, {3, 4, 5}}}, {finds:{{4, 5, 6}}}, {finds:{{5}, {5}}}}</langsyntaxhighlight>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">lis: function [d][
l: new [[]]
loop d 'num [
Line 284:
] 'seq [
print ["LIS of" seq "=>" lis seq]
]</langsyntaxhighlight>
 
{{out}}
Line 292:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">Lists := [[3,2,6,4,5,1], [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]]
 
for k, v in Lists {
Line 313:
}
return, D
}</langsyntaxhighlight>
'''Output:'''
<pre>3, 4, 5
Line 320:
=={{header|C}}==
Using an array that doubles as linked list (more like reversed trees really). O(n) memory and O(n<sup>2</sup>) runtime.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 363:
lis(y, sizeof(y) / sizeof(int));
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 373:
===Recursive===
{{works with|C sharp|6}}
<langsyntaxhighlight lang="csharp">using System;
using System.Collections;
using System.Collections.Generic;
Line 420:
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}</langsyntaxhighlight>
===Patience sorting===
{{works with|C sharp|7}}
<langsyntaxhighlight lang="csharp">public static class LIS
{
public static T[] Find<T>(IList<T> values, IComparer<T> comparer = null) {
Line 449:
Console.WriteLine(string.Join(",", LIS.Find(new [] { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 })));
}
}</langsyntaxhighlight>
{{out}}
<pre>
Line 458:
Patience sorting
=== C++11 ===
<langsyntaxhighlight lang="cpp">#include <vector>
#include <list>
#include <algorithm>
Line 523:
show_lis(std::list<int> { 3, 2, 6, 4, 5, 1 });
show_lis(std::vector<int> { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 });
}</langsyntaxhighlight>
=== C++98 ===
<langsyntaxhighlight lang="cpp">#include <vector>
#include <list>
#include <algorithm>
Line 607:
show_lis(vec1);
show_lis(vec2);
}</langsyntaxhighlight>
{{out}}
<pre>2 4 5
Line 617:
The combination is done using ''cons'', so what gets put on a pile is a list -- a descending subsequence.
 
<langsyntaxhighlight Clojurelang="clojure">(defn place [piles card]
(let [[les gts] (->> piles (split-with #(<= (ffirst %) card)))
newelem (cons card (->> les last first))
Line 628:
 
(println (a-longest [3 2 6 4 5 1]))
(println (a-longest [0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15]))</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang="text">(2 4 5)
(0 2 6 9 11 15)</langsyntaxhighlight>
 
=={{header|Common Lisp}}==
===Common Lisp: Using the method in the video===
Slower and more memory usage compared to the patience sort method.
<langsyntaxhighlight lang="lisp">(defun longest-increasing-subseq (list)
(let ((subseqs nil))
(dolist (item list)
Line 655:
(dolist (l (list (list 3 2 6 4 5 1)
(list 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15)))
(format t "~A~%" (longest-increasing-subseq l))))</langsyntaxhighlight>
{{out}}
<pre>(2 4 5)
Line 661:
===Common Lisp: Using the Patience Sort approach===
This is 5 times faster and and uses a third of the memory compared to the approach in the video.
<langsyntaxhighlight lang="lisp">(defun lis-patience-sort (input-list)
(let ((piles nil))
(dolist (item input-list)
Line 683:
(dolist (l (list (list 3 2 6 4 5 1)
(list 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15)))
(format t "~A~%" (lis-patience-sort l)))</langsyntaxhighlight>
{{out}}
<pre>(2 4 5)
Line 689:
===Common Lisp: Using the Patience Sort approach (alternative)===
This is a different version of the code above.
<langsyntaxhighlight lang="lisp">(defun insert-item (item piles)
(multiple-value-bind
(i prev)
Line 708:
(dolist (l (list (list 3 2 6 4 5 1)
(list 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15)))
(format t "~A~%" (longest-inc-seq l)))</langsyntaxhighlight>
{{out}}
<pre>(2 4 5)
Line 717:
{{trans|Haskell}}
Uses the second powerSet function from the Power Set Task.
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, power_set2;
 
T[] lis(T)(T[] items) pure nothrow {
Line 731:
[3, 2, 6, 4, 5, 1].lis.writeln;
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15].lis.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>[2, 4, 5]
Line 739:
{{trans|Python}}
From the second Python entry, using the Patience sorting method.
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.array;
 
/// Return one of the Longest Increasing Subsequence of
Line 776:
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]])
d.lis.writeln;
}</langsyntaxhighlight>
The output is the same.
 
Line 782:
{{trans|Java}}
With some more optimizations.
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.range, std.array;
 
T[] lis(T)(in T[] items) pure nothrow
Line 831:
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]])
d.writeln;
}</langsyntaxhighlight>
The output is the same.
 
=={{header|Déjà Vu}}==
{{trans|Python}}
<langsyntaxhighlight lang="dejavu">in-pair:
if = :nil dup:
false drop
Line 861:
!. lis [ 3 2 6 4 5 1 ]
!. lis [ 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15 ]
</syntaxhighlight>
</lang>
 
{{out}}
<pre>[ 2 4 5 ]
[ 0 2 6 9 11 15 ]</pre>
 
=={{header|EasyLang}}==
{{trans|Ring}}
<syntaxhighlight>
func[] lis x[] .
n = len x[]
len p[] n
len m[] n
for i to n
lo = 1
hi = lng
while lo <= hi
mid = (lo + hi) div 2
if x[m[mid]] < x[i]
lo = mid + 1
else
hi = mid - 1
.
.
if lo > 1
p[i] = m[lo - 1]
.
m[lo] = i
if lo > lng
lng = lo
.
.
len res[] lng
if lng > 0
k = m[lng]
for i = lng downto 1
res[i] = x[k]
k = p[k]
.
.
return res[]
.
tests[][] = [ [ 3 2 6 4 5 1 ] [ 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15 ] ]
for x to len tests[][]
print lis tests[x][]
.
</syntaxhighlight>
{{out}}
<pre>
[ 2 4 5 ]
[ 0 2 6 9 11 15 ]
</pre>
 
=={{header|Elixir}}==
Line 871 ⟶ 918:
===Naive version===
very slow
<langsyntaxhighlight lang="elixir">defmodule Longest_increasing_subsequence do
# Naive implementation
def lis(l) do
Line 889 ⟶ 936:
 
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])</langsyntaxhighlight>
 
{{out}}
Line 898 ⟶ 945:
 
===Patience sort version===
<langsyntaxhighlight lang="elixir">defmodule Longest_increasing_subsequence do
# Patience sort implementation
def patience_lis(l), do: patience_lis(l, [])
Line 925 ⟶ 972:
 
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])</langsyntaxhighlight>
 
{{out}}
Line 949 ⟶ 996:
Function ''memo'' and ''patience2'' by [https://www.linkedin.com/in/find-roman/ Roman Rabinovich].
 
<langsyntaxhighlight lang="erlang">
-module(longest_increasing_subsequence).
 
Line 1,159 ⟶ 1,206:
 
% **************************************************
</syntaxhighlight>
</lang>
 
Output naive:
Line 1,184 ⟶ 1,231:
[0,2,6,9,11,15]
</pre>
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vb">Sub Lis(arr() As Integer)
Dim As Integer lb = Lbound(arr), ub = Ubound(arr)
Dim As Integer i, lo, hi, mitad, newl, l = 0
Dim As Integer p(ub), m(ub)
For i = lb To ub
lo = 1
hi = l
Do While lo <= hi
mitad = Int((lo+hi)/2)
If arr(m(mitad)) < arr(i) Then
lo = mitad + 1
Else
hi = mitad - 1
End If
Loop
newl = lo
p(i) = m(newl-1)
m(newl) = i
If newL > l Then l = newl
Next i
Dim As Integer res(l)
Dim As Integer k = m(l)
For i = l-1 To 0 Step - 1
res(i) = arr(k)
k = p(k)
Next i
For i = Lbound(res) To Ubound(res)-1
Print res(i); " ";
Next i
End Sub
 
Dim As Integer arrA(5) => {3,2,6,4,5,1}
Lis(arrA())
Print
Dim As Integer arrB(15) => {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}
Lis(arrB())
 
Sleep</syntaxhighlight>
{{out}}
<pre>2 4 5
0 2 6 9 11 15</pre>
 
=={{header|Go}}==
Patience sorting
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,229 ⟶ 1,322:
fmt.Printf("an L.I.S. of %v is %v\n", d, lis(d))
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,237 ⟶ 1,330:
=={{header|Haskell}}==
===Naive implementation===
<langsyntaxhighlight Haskelllang="haskell">import Data.Ord ( comparing )
import Data.List ( maximumBy, subsequences )
import Data.List.Ordered ( isSorted, nub )
Line 1,248 ⟶ 1,341:
print $ lis [3,2,6,4,5,1]
print $ lis [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
print $ lis [1,1,1,1]</langsyntaxhighlight>
 
{{out}}
Line 1,256 ⟶ 1,349:
 
===Patience sorting===
<langsyntaxhighlight Haskelllang="haskell">{-# LANGUAGE FlexibleContexts, UnicodeSyntax #-}
 
module Main (main, lis) where
Line 1,307 ⟶ 1,400:
print $ lis [3, 2, 6, 4, 5, 1]
print $ lis [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
print $ lis [1, 1, 1, 1]</langsyntaxhighlight>
 
{{out}}
Line 1,318 ⟶ 1,411:
The following works in both languages:
 
<langsyntaxhighlight lang="unicon">procedure main(A)
every writes((!lis(A)||" ") | "\n")
end
Line 1,328 ⟶ 1,421:
else p[-1] := (p[-2] < v)
return r
end</langsyntaxhighlight>
 
Sample runs:
Line 1,343 ⟶ 1,436:
These examples are simple enough for brute force to be reasonable:
 
<langsyntaxhighlight lang="j">increasing=: (-: /:~)@#~"1 #:@i.@^~&2@#
longestinc=: ] #~ [: (#~ ([: (= >./) +/"1)) #:@I.@increasing</langsyntaxhighlight>
 
In other words: consider all 2^n bitmasks of length n, and select those which strictly select increasing sequences. Find the length of the longest of these and use the masks of that length to select from the original sequence.
Line 1,350 ⟶ 1,443:
Example use:
 
<syntaxhighlight lang="j">
<lang j>
longestinc 3,2,6,4,5,1
2 4 5
Line 1,358 ⟶ 1,451:
0 2 6 9 13 15
0 4 6 9 11 15
0 4 6 9 13 15</langsyntaxhighlight>
 
=={{header|Java}}==
A solution based on patience sorting, except that it is not necessary to keep the whole pile, only the top (in solitaire, bottom) of the pile, along with pointers from each "card" to the top of its "previous" pile.
<langsyntaxhighlight lang="java">import java.util.*;
 
public class LIS {
Line 1,401 ⟶ 1,494:
System.out.printf("an L.I.S. of %s is %s\n", d, lis(d));
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,408 ⟶ 1,501:
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">function getLis(input) {
if (input.length === 0) {
return [];
Line 1,441 ⟶ 1,534:
console.log(getLongestIncreasingSubsequence([0, 7, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]));
console.log(getLongestIncreasingSubsequence([3, 2, 6, 4, 5, 1]));
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,450 ⟶ 1,543:
 
===Patience sorting===
<langsyntaxhighlight JavaScriptlang="javascript">function getLIS(input) {
if (input.length === 0) {
return 0;
Line 1,489 ⟶ 1,582:
console.log(getLongestIncreasingSubsequence([0, 7, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]));
console.log(getLongestIncreasingSubsequence([3, 2, 6, 4, 5, 1]));
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,504 ⟶ 1,597:
 
Recent versions of jq have functions that obviate the need for the two generic functions defined in this subsection.
<langsyntaxhighlight lang="jq">def until(cond; update):
def _until:
if cond then . else (update | _until) end;
Line 1,520 ⟶ 1,613:
else .[0] = $mid + 1
end )
| .[0];</langsyntaxhighlight>
'''lis:'''
<langsyntaxhighlight lang="jq">def lis:
 
# Helper function:
Line 1,539 ⟶ 1,632:
)
| .[length - 1]
| reverse( recurse(.back) | .val ) ; </langsyntaxhighlight>
 
'''Examples:'''
<langsyntaxhighlight lang="jq">( [3,2,6,4,5,1],
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
) | lis</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="sh">$ jq -c -n -f lis.jq
[2,4,5]
[0,2,6,9,11,15]
</syntaxhighlight>
</lang>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">
function lis(arr::Vector)
if length(arr) == 0 return copy(arr) end
Line 1,574 ⟶ 1,667:
 
@show lis([3, 2, 6, 4, 5, 1])
@show lis([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15])</langsyntaxhighlight>
 
{{out}}
Line 1,582 ⟶ 1,675:
=={{header|Kotlin}}==
Uses the algorithm in the Wikipedia L.I.S. article:
<langsyntaxhighlight lang="scala">// version 1.1.0
 
fun longestIncreasingSubsequence(x: IntArray): IntArray =
Line 1,622 ⟶ 1,715:
)
lists.forEach { println(longestIncreasingSubsequence(it).asList()) }
}</langsyntaxhighlight>
 
{{out}}
Line 1,631 ⟶ 1,724:
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function buildLIS(seq)
local piles = { { {table.remove(seq, 1), nil} } }
while #seq>0 do
Line 1,657 ⟶ 1,750:
buildLIS({3,2,6,4,5,1})
buildLIS({0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15})
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,668 ⟶ 1,761:
stack:=stackitem(L(i)), ! stack(L(j)) returns a refence to a new stack object, with the first item on L(i) (which is a reference to stack object) and merge using ! the copy of L(j) stack.
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module LIS_example {
Function LIS {
Line 1,706 ⟶ 1,799:
}
LIS_example
</syntaxhighlight>
</lang>
 
===Using arrays in an array===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module LIS_example {
Function LIS {
Line 1,749 ⟶ 1,842:
}
LIS_example
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,760 ⟶ 1,853:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple"># dynamic programming:
LIS := proc(L)
local i, j;
Line 1,785 ⟶ 1,878:
return output[index];
end proc:</langsyntaxhighlight>
Alternatively, output the longest subsequence using built-in command max:
<langsyntaxhighlight Maplelang="maple">i := max[index](map(numelems,output));
output[i];</langsyntaxhighlight>
 
<langsyntaxhighlight Maplelang="maple">L := [3, 2, 6, 4, 5, 1];
M := [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
LIS(L);
LIS(M);</langsyntaxhighlight>
{{out}}
<pre>
Line 1,803 ⟶ 1,896:
=={{header|Mathematica}}/{{header|Wolfram Language}}==
Although undocumented, Mathematica has the function LongestAscendingSequence which exactly does what the Task asks for:
<langsyntaxhighlight Mathematicalang="mathematica">LongestAscendingSequence/@{{3,2,6,4,5,1},{0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15}}</langsyntaxhighlight>
{{out}}
<pre>{{2,4,5},{0,2,6,9,11,15}}</pre>
Line 1,809 ⟶ 1,902:
=={{header|Nim}}==
{{trans|Python}}
<langsyntaxhighlight Nimlang="nim">proc longestIncreasingSubsequence[T](d: seq[T]): seq[T] =
var l: seq[seq[T]]
for i in 0 .. d.high:
Line 1,822 ⟶ 1,915:
 
for d in [@[3,2,6,4,5,1], @[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]:
echo "A L.I.S. of ", d, " is ", longestIncreasingSubsequence(d)</langsyntaxhighlight>
{{out}}
<pre>A L.I.S. of @[3, 2, 6, 4, 5, 1] is @[3, 4, 5]
Line 1,829 ⟶ 1,922:
=={{header|Objective-C}}==
Patience sorting
<langsyntaxhighlight lang="objc">#import <Foundation/Foundation.h>
 
@interface Node : NSObject {
Line 1,881 ⟶ 1,974:
}
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>an L.I.S. of (
Line 1,923 ⟶ 2,016:
=={{header|OCaml}}==
===Naïve implementation===
<langsyntaxhighlight OCamllang="ocaml">let longest l = List.fold_left (fun acc x -> if List.length acc < List.length x
then x
else acc) [] l
Line 1,945 ⟶ 2,038:
in
List.map (fun x -> print_endline (String.concat " " (List.map string_of_int
(lis x)))) sequences</langsyntaxhighlight>
{{out}}
<pre>
Line 1,953 ⟶ 2,046:
 
===Patience sorting===
<langsyntaxhighlight lang="ocaml">let lis cmp list =
let pile_tops = Array.make (List.length list) [] in
let bsearch_piles x len =
Line 1,974 ⟶ 2,067:
in
let len = List.fold_left f 0 list in
List.rev pile_tops.(len-1)</langsyntaxhighlight>
Usage:
<pre># lis compare [3; 2; 6; 4; 5; 1];;
Line 1,980 ⟶ 2,073:
# lis compare [0; 8; 4; 12; 2; 10; 6; 14; 1; 9; 5; 13; 3; 11; 7; 15];;
- : int list = [0; 2; 6; 9; 11; 15]</pre>
 
=={{header|Pascal}}==
{{works with|FPC}}
O(NLogN) version.
<syntaxhighlight lang="pascal">
program LisDemo;
{$mode objfpc}{$h+}
uses
SysUtils;
 
function Lis(const A: array of Integer): specialize TArray<Integer>;
var
TailIndex: array of Integer;
function CeilIndex(Value, R: Integer): Integer;
var
L, M: Integer;
begin
L := 0;
while L < R do begin
{$PUSH}{$Q-}{$R-}M := (L + R) shr 1;{$POP}
if A[TailIndex[M]] < Value then L := M + 1
else R := M;
end;
Result := R;
end;
var
I, J, Len: Integer;
Parents: array of Integer;
begin
Result := nil;
if Length(A) = 0 then exit;
SetLength(TailIndex, Length(A));
SetLength(Parents, Length(A));
Len := 1;
for I := 1 to High(A) do
if A[I] < A[TailIndex[0]] then
TailIndex[0] := I
else
if A[TailIndex[Len-1]] < A[I] then begin
Parents[I] := TailIndex[Len - 1];
TailIndex[Len] := I;
Inc(Len);
end else begin
J := CeilIndex(A[I], Len - 1);
Parents[I] := TailIndex[J - 1];
TailIndex[J] := I;
end;
if Len < 2 then exit([A[0]]);
SetLength(Result, Len);
J := TailIndex[Len - 1];
for I := Len - 1 downto 0 do begin
Result[I] := A[J];
J := Parents[J];
end;
end;
 
procedure PrintArray(const A: array of Integer);
var
I: SizeInt;
begin
Write('[');
for I := 0 to High(A) - 1 do
Write(A[I], ', ');
WriteLn(A[High(A)], ']');
end;
 
begin
PrintArray(Lis([3, 2, 6, 4, 5, 1]));
PrintArray(Lis([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]));
PrintArray(Lis([1, 1, 1, 1, 1, 0]));
end.
</syntaxhighlight>
{{out}}
<pre>
[2, 4, 5]
[0, 2, 6, 9, 11, 15]
[1]
</pre>
 
=={{header|Perl}}==
===Dynamic programming===
{{trans|Raku}}
<langsyntaxhighlight Perllang="perl">use strict;
 
sub lis {
Line 2,005 ⟶ 2,176:
 
print join ' ', lis 3, 2, 6, 4, 5, 1;
print join ' ', lis 0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15;</langsyntaxhighlight>
{{out}}
<pre>2 4 5
Line 2,011 ⟶ 2,182:
 
===Patience sorting===
<langsyntaxhighlight lang="perl">sub lis {
my @pileTops;
# sort into piles
Line 2,044 ⟶ 2,215:
print "an L.I.S. of [@d] is [@lis]\n";
}</langsyntaxhighlight>
{{out}}
<pre>an L.I.S. of [3 2 6 4 5 1] is [2 4 5]
Line 2,051 ⟶ 2,222:
=={{header|Phix}}==
Using the Wikipedia algorithm (converted to 1-based indexing)
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">lis</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">))</span>
Line 2,090 ⟶ 2,261:
<span style="color: #0000FF;">?</span><span style="color: #000000;">lis</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,099 ⟶ 2,270:
=={{header|PHP}}==
Patience sorting
<langsyntaxhighlight lang="php"><?php
class Node {
public $val;
Line 2,135 ⟶ 2,306:
print_r(lis(array(3, 2, 6, 4, 5, 1)));
print_r(lis(array(0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15)));
?></langsyntaxhighlight>
{{out}}
<pre>Array
Line 2,154 ⟶ 2,325:
 
=={{header|Picat}}==
===Mode-directed tabling===
Two methods:
{{trans|Prolog}}
* mode directed tabling: lis_mode/3 (Inspired by the Prolog version)
<syntaxhighlight lang="picat">table(+,+,max)
* constraint modelling: lis_cp/3. (For larger instances, the sat solver is generally faster than the cp solver.)
 
The mode directed tabling tends to be the fastest of the two methods.
 
<lang Picat>import sat. % for lis_cp
% import cp. % Slower than sat on larger instances.
 
go =>
nolog,
Tests = [
[3,2,6,4,5,1],
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],
[1,1,1,1],
[4,65,2,-31,0,99,83,782,1]
],
Funs = [lis_mode, lis_cp],
foreach(Fun in Funs)
println(fun=Fun),
foreach(Test in Tests)
call(Fun,Test,Lis,Len),
printf("%w: LIS=%w (len=%d)\n",Test, Lis,Len)
end,
nl,
end,
nl.
 
 
%
% Mode directed tabling (inspired by the Prolog version)
%
table(+,+,max)
lis_mode(In, Out,OutLen) =>
one_is(In, [], Is),
Line 2,197 ⟶ 2,337:
( Current = [], one_is(T, [H], Final));
( Current = [H1|_], H1 @< H, one_is(T, [H|Current], Final));
one_is(T, Current, Final).</syntaxhighlight>
 
===Constraint modelling approach===
%
For larger instances, the sat solver is generally faster than the cp solver.
% Constraint modelling approach.
<syntaxhighlight lang="picat">lis_cp(S, Res,Z) =>
%
lis_cp(S, Res,Z) =>
Len = S.len,
X = new_list(Len),
Line 2,221 ⟶ 2,360:
foreach(I in 1..N, J in I+1..N)
(A[I] #!= 0 #/\ A[J] #!= 0) #=> (A[I] #< A[J])
end.</langsyntaxhighlight>
 
===Test===
Both outputs:
<syntaxhighlight lang="picat">import sat. % for lis_cp
% import cp. % Slower than sat on larger instances.
 
go =>
nolog,
Tests = [
[3,2,6,4,5,1],
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15],
[1,1,1,1],
[4,65,2,-31,0,99,83,782,1]
],
Funs = [lis_mode, lis_cp],
foreach(Fun in Funs)
println(fun=Fun),
foreach(Test in Tests)
call(Fun,Test,Lis,Len),
printf("%w: LIS=%w (len=%d)\n",Test, Lis,Len)
end,
nl,
end,
nl.</syntaxhighlight>
 
{{out}}
<pre>[3,2,6,4,5,1]: LIS=[3,4,5] (len=3)
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]: LIS=[0,4,6,9,13,15] (len=6)
Line 2,229 ⟶ 2,392:
[4,65,2,-31,0,99,83,782,1]: LIS=[4,65,99,782] (len=4)</pre>
 
The mode directed tabling tends to be the fastest of the two methods.
 
=={{header|PicoLisp}}==
Adapted patience sorting approach:
<langsyntaxhighlight PicoLisplang="picolisp">(de longinc (Lst)
(let (D NIL R NIL)
(for I Lst
Line 2,244 ⟶ 2,408:
(T (when R (queue 'D (car R)))
(push 'R I) ) ) )
(flip R) ) )</langsyntaxhighlight>
 
Original recursive glutton:
<langsyntaxhighlight PicoLisplang="picolisp">(de glutton (L)
(let N (pop 'L)
(maxi length
Line 2,267 ⟶ 2,431:
(test (-31 0 83 782)
(glutton (4 65 2 -31 0 99 83 782 1)) )</langsyntaxhighlight>
 
=={{header|PowerShell}}==
{{works with|PowerShell|2}}
<langsyntaxhighlight PowerShelllang="powershell">function Get-LongestSubsequence ( [int[]]$A )
{
If ( $A.Count -lt 2 ) { return $A }
Line 2,318 ⟶ 2,482:
# Return the series (reversed into the correct order)
return $S[$Last..0]
}</langsyntaxhighlight>
<langsyntaxhighlight PowerShelllang="powershell">( Get-LongestSubsequence 3, 2, 6, 4, 5, 1 ) -join ', '
( Get-LongestSubsequence 0, 8, 4, 12, 2, 10, 6, 16, 14, 1, 9, 5, 13, 3, 11, 7, 15 ) -join ', '</langsyntaxhighlight>
{{out}}
<pre>2, 4, 5
Line 2,330 ⟶ 2,494:
 
 
<langsyntaxhighlight lang="prolog">lis(In, Out) :-
% we ask Prolog to find the longest sequence
aggregate(max(N,Is), (one_is(In, [], Is), length(Is, N)), max(_, Res)),
Line 2,344 ⟶ 2,508:
( Current = [H1 | _], H1 < H, one_is(T, [H | Current], Final));
one_is(T, Current, Final).
</syntaxhighlight>
</lang>
Prolog finds the first longest subsequence
<pre> ?- lis([0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15], Out).
Line 2,356 ⟶ 2,520:
 
===Python: O(nlogn) Method from Wikipedia's LIS Article[https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms]===
<langsyntaxhighlight lang="python">def longest_increasing_subsequence(X):
"""Returns the Longest Increasing Subsequence in the Given List/Array"""
N = len(X)
Line 2,388 ⟶ 2,552:
if __name__ == '__main__':
for d in [[3,2,6,4,5,1], [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]:
print('a L.I.S. of %s is %s' % (d, longest_increasing_subsequence(d)))</langsyntaxhighlight>
 
{{out}}
Line 2,395 ⟶ 2,559:
 
===Python: Method from video===
<langsyntaxhighlight lang="python">def longest_increasing_subsequence(d):
'Return one of the L.I.S. of list d'
l = []
Line 2,405 ⟶ 2,569:
if __name__ == '__main__':
for d in [[3,2,6,4,5,1], [0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]:
print('a L.I.S. of %s is %s' % (d, longest_increasing_subsequence(d)))</langsyntaxhighlight>
 
{{out}}
Line 2,412 ⟶ 2,576:
 
===Python: Patience sorting method===
<langsyntaxhighlight lang="python">from collections import namedtuple
from functools import total_ordering
from bisect import bisect_left
Line 2,440 ⟶ 2,604:
for d in [[3,2,6,4,5,1],
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]]:
print('a L.I.S. of %s is %s' % (d, lis(d)))</langsyntaxhighlight>
 
{{out}}
Line 2,448 ⟶ 2,612:
=={{header|Racket}}==
Patience sorting. The program saves only the top card of each pile, with a link (cons) to the top of the previous pile at the time it was inserted. It uses binary search to find the correct pile.
<langsyntaxhighlight Racketlang="racket">#lang racket/base
(require data/gvector)
 
Line 2,474 ⟶ 2,638:
(if (<= item (car (gvector-ref piles middle)))
(loop first middle)
(loop (add1 middle) last)))))])))</langsyntaxhighlight>
{{out}}
<pre>'(2 4 5)
Line 2,485 ⟶ 2,649:
Straight-forward implementation of the algorithm described in the video.
<syntaxhighlight lang="raku" perl6line>sub lis(@d) {
my @l = [].item xx @d;
@l[0].push: @d[0];
Line 2,500 ⟶ 2,664:
 
say lis([3,2,6,4,5,1]);
say lis([0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]);</langsyntaxhighlight>
{{out}}
<pre>[2 4 5]
Line 2,506 ⟶ 2,670:
 
===Patience sorting===
<syntaxhighlight lang="raku" perl6line>sub lis(@deck is copy) {
my @S = [@deck.shift() => Nil].item;
for @deck -> $card {
Line 2,521 ⟶ 2,685:
 
say lis <3 2 6 4 5 1>;
say lis <0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15>;</langsyntaxhighlight>
{{out}}
<pre>[2 4 5]
Line 2,528 ⟶ 2,692:
=={{header|REXX}}==
{{trans|VBScript}}
<langsyntaxhighlight lang="rexx">/*REXX program finds & displays the longest increasing subsequence from a list of #'s.*/
$.=; $.1= 3 2 6 4 5 1 /*define the 1st list to be examined. */
$.2= 0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15 /* " " 2nd " " " " */
Line 2,560 ⟶ 2,724:
do L; $= @.k $; k= p.k /*perform this DO loop L times. */
end /*i*/
return strip($) /*the result has an extra leading blank*/</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default input:}}
<pre>
Line 2,571 ⟶ 2,735:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Longest increasing subsequence
 
Line 2,630 ⟶ 2,794:
see svect
see "}" + nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 2,639 ⟶ 2,803:
=={{header|Ruby}}==
Patience sorting
<langsyntaxhighlight lang="ruby">Node = Struct.new(:val, :back)
 
def lis(n)
Line 2,671 ⟶ 2,835:
 
p lis([3, 2, 6, 4, 5, 1])
p lis([0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15])</langsyntaxhighlight>
{{out}}
<pre>[2, 4, 5]
Line 2,678 ⟶ 2,842:
=={{header|Rust}}==
 
<syntaxhighlight lang="rust">
<lang Rust>
fn lis(x: &[i32])-> Vec<i32> {
let n = x.len();
Line 2,723 ⟶ 2,887:
let list = vec![0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15];
println!("{:?}", lis(&list));
}</langsyntaxhighlight>
 
{{out}}
Line 2,732 ⟶ 2,896:
===Patience sorting===
{{Out}}See it in running in your browser by [https://scalafiddle.io/sf/Wx8DsUO/1 ScalaFiddle (JavaScript)] or by [https://scastie.scala-lang.org/FtLHeaAwSrO6VXVOTTZ7FQ Scastie (JVM)].
<langsyntaxhighlight Scalalang="scala">object LongestIncreasingSubsequence extends App {
val tests = Map(
"3,2,6,4,5,1" -> Seq("2,4,5", "3,4,5"),
Line 2,764 ⟶ 2,928:
allLongests.forall(lis => expect.contains(lis.mkString(",")))
})
}</langsyntaxhighlight>
{{Out}}
<pre>3,2,6,4,5,1 has 2 longest increasing subsequences, e.g. 2,4,5
Line 2,770 ⟶ 2,934:
 
===Brute force solution===
<langsyntaxhighlight Scalalang="scala">def powerset[A](s: List[A]) = (0 to s.size).map(s.combinations(_)).reduce(_++_)
def isSorted(l:List[Int])(f: (Int, Int) => Boolean) = l.view.zip(l.tail).forall(x => f(x._1,x._2))
def sequence(set: List[Int])(f: (Int, Int) => Boolean) = powerset(set).filter(_.nonEmpty).filter(x => isSorted(x)(f)).toList.maxBy(_.length)
 
sequence(set)(_<_)
sequence(set)(_>_)</langsyntaxhighlight>
 
=={{header|Scheme}}==
Patience sorting
<langsyntaxhighlight lang="scheme">(define (lis less? lst)
(define pile-tops (make-vector (length lst)))
(define (bsearch-piles x len)
Line 2,802 ⟶ 2,966:
 
(display (lis < '(3 2 6 4 5 1))) (newline)
(display (lis < '(0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15))) (newline)</langsyntaxhighlight>
 
{{out}}
Line 2,810 ⟶ 2,974:
=={{header|Sidef}}==
Dynamic programming:
<langsyntaxhighlight lang="ruby">func lis(a) {
var l = a.len.of { [] }
l[0] << a[0]
Line 2,825 ⟶ 2,989:
 
say lis(%i<3 2 6 4 5 1>)
say lis(%i<0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15>)</langsyntaxhighlight>
 
Patience sorting:
<langsyntaxhighlight lang="ruby">func lis(deck) {
var pileTops = []
deck.each { |x|
Line 2,854 ⟶ 3,018:
 
say lis(%i<3 2 6 4 5 1>)
say lis(%i<0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15>)</langsyntaxhighlight>
 
{{out}}
Line 2,865 ⟶ 3,029:
Patience sorting
{{works with|SML/NJ}}
<langsyntaxhighlight lang="sml">fun lis cmp n =
let
val pile_tops = DynamicArray.array (length n, [])
Line 2,895 ⟶ 3,059:
app f n;
rev (DynamicArray.sub (pile_tops, DynamicArray.bound pile_tops))
end</langsyntaxhighlight>
Usage:
<pre>- lis Int.compare [3, 2, 6, 4, 5, 1];
Line 2,904 ⟶ 3,068:
=={{header|Swift}}==
 
<langsyntaxhighlight lang="swift">import Foundation
 
extension Array where Element: Comparable {
Line 2,951 ⟶ 3,115:
 
print("\(l1) = \(l1.longestIncreasingSubsequence())")
print("\(l2) = \(l2.longestIncreasingSubsequence())")</langsyntaxhighlight>
 
{{out}}
Line 2,961 ⟶ 3,125:
{{trans|Python}}
Based on the Python video solution. Interpreter at [[http://cheersgames.com/swym/SwymInterpreter.html?Array.%27lis%27%0A%7B%0A%20%20%27stems%27%20%3D%20Number.Array.mutableArray%5B%20%5B%5D%20%5D%0A%20%0A%20%20forEach%28this%29%20%27value%27-%3E%0A%20%20%7B%0A%20%20%20%20%27bestStem%27%20%3D%20stems.where%7B%3D%3D%5B%5D%20%7C%7C%20.last%20%3C%20value%7D.max%7B.length%7D%0A%20%0A%20%20%20%20stems.push%28%20bestStem%20+%20%5Bvalue%5D%20%29%0A%20%20%7D%0A%20%0A%20%20return%20stems.max%7B.length%7D%0A%7D%0A%20%0A%5B3%2C2%2C6%2C4%2C5%2C1%5D.lis.trace%0A%5B0%2C8%2C4%2C12%2C2%2C10%2C6%2C14%2C1%2C9%2C5%2C13%2C3%2C11%2C7%2C15%5D.lis.trace]]
<langsyntaxhighlight lang="swym">Array.'lis'
{
'stems' = Number.Array.mutableArray[ [] ]
Line 2,976 ⟶ 3,140:
 
[3,2,6,4,5,1].lis.trace
[0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15].lis.trace</langsyntaxhighlight>
{{out}}
<pre>
Line 2,985 ⟶ 3,149:
=={{header|Tcl}}==
{{works with|Tcl|8.6}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.6
 
proc longestIncreasingSubsequence {sequence} {
Line 3,005 ⟶ 3,169:
# Pick the longest subsequence; -stride requires Tcl 8.6
return [lindex [lsort -stride 2 -index 0 $subseq] end]
}</langsyntaxhighlight>
Demonstrating:
<langsyntaxhighlight lang="tcl">puts [longestIncreasingSubsequence {3 2 6 4 5 1}]
puts [longestIncreasingSubsequence {0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15}]</langsyntaxhighlight>
{{out}}
<pre>
Line 3,016 ⟶ 3,180:
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
Function LIS(arr)
n = UBound(arr)
Line 3,054 ⟶ 3,218:
WScript.StdOut.WriteLine LIS(Array(3,2,6,4,5,1))
WScript.StdOut.WriteLine LIS(Array(0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15))
</syntaxhighlight>
</lang>
 
{{Out}}
Line 3,064 ⟶ 3,228:
=={{header|Wren}}==
{{trans|Kotlin}}
<langsyntaxhighlight ecmascriptlang="wren">var longestIncreasingSubsequence = Fn.new { |x|
var n = x.count
if (n == 0) return []
Line 3,100 ⟶ 3,264:
[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]
]
lists.each { |l| System.print(longestIncreasingSubsequence.call(l)) }</langsyntaxhighlight>
 
{{out}}
Line 3,109 ⟶ 3,273:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn longestSequence(ns){ // based on Patience sorting
piles:=L();
backPtr:='wrap(np){ return(np-1,if(np) piles[np-1].len()-1 else -1) }; // maybe (-1,-1)
Line 3,125 ⟶ 3,289:
do{ n,p=piles[p][n]; r.write(n); p,n=p; }while(p!=-1);
r.reverse()
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">foreach ns in (T(T(1),T(3,2,6,4,5,1),T(4,65,2,-31,0,99,83,782,1),
T(0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15),"foobar")){
s:=longestSequence(ns);
println(s.len(),": ",s," from ",ns);
}</langsyntaxhighlight>
{{out}}
<pre>
2,041

edits