[Jprogramming] Greatest Increasing Subsequence

'Mike Day' via Programming programming at jsoftware.com
Fri Sep 9 23:26:32 UTC 2016


Thanks.
I'm sure you know the following,  but it might be worth pointing out:

    longascseq l
6 9 20 21 22 25 26 27

    l{~longascseq l
1 2 3 4 5 7 11 19

    lisM l
1 2 3 4 5 7 11 19

ie, longascseq returns the indices of the/a subsequence.

Very limited testing suggests that it's a little bit slower,
(on 10000 elements) but saves space compared to the function,
lisM, that I posted earlier.  I suppose that's because of the
if-then-else block,  though I haven't studied their differences
yet.

Cheers,
Mike

On 09/09/2016 20:09, Henry Rich wrote:
> I have created a Wiki page for this, where you can post solutions.
>
> http://code.jsoftware.com/wiki/Essays/Longest_Increasing_Subsequence
>
> I don't think a tacit solution can be efficient, considering how many 
> in-place operations are needed.
>
> Henry Rich
>
> On 9/9/2016 1:46 PM, Erling Hellenäs wrote:
>> Hi all !
>>
>> This one is considerably faster, near lisJ.
>>
>> ts'LongestIncreasingSubsequence 10000?10000'
>>
>> 2.40974 3.808e6
>>
>> ts'LongestIncreasingSubsequence ?10000$10000'
>>
>> 2.46657 3.41504e6
>>
>>
>> It still uses a lot of memory. Handles 100 000 with quite some struggle.
>>
>>
>> ts'LongestIncreasingSubsequence ?100000$100000'
>>
>> 81.525 3.30742e7
>>
>> Cheers,
>>
>> Erling
>>
>> NB. This is a solution to the problem of finding the longest strictly 
>> increasing subsequence.
>>
>> NB. Draws numbers from the end of the sequence. Selects groups with 
>> its first element larger
>>
>> NB. than the drawn element. Selects one of the longest of these 
>> groups if one exists and prepends
>>
>> NB. the drawn number. If no such group exists create a new group 
>> containing the drawn number.
>>
>> NB. Append the new group to the previous groups.
>>
>> NB. Removes groups which are both shorter than the new group and 
>> which starts
>>
>> NB. with a number which is smaller or equal to the number which 
>> starts the new group.
>>
>> NB. When all numbers are drawn one of the longest remaining groups is 
>> selected.
>>
>>
>>
>> GroupOfEmptyGroupInitialState=: [: < a:"_
>>
>> GroupOfEmptyGroupInitialState ''
>>
>> PackElements=: <@+
>>
>> PackElements 6 1 3 4 2 8
>>
>> SelectGroupsWithLeftLessThanFirstElement=: ([: , [ < [: (1 {. ])@> ]) 
>> # ]
>>
>> PrependLeftInGroups=: ([: < [) ,&.> ]
>>
>> 2 PrependLeftInGroups <4 5
>>
>> AddGroupWithLeftIfNoGroups=: ((0 = [: # ]) {. [: < [) , ]
>>
>> 2 AddGroupWithLeftIfNoGroups 0 {. <i.0
>>
>> 2 AddGroupWithLeftIfNoGroups , <1 2
>>
>> SelectFirstGroupOfMaxLength=: ([: ((1 <. #) {. ]) [: I. ([: (] = '' $ 
>> [: >./ ]) #@>)) { ]
>>
>> SelectFirstGroupOfMaxLength (<2),(<2 4 5),<2 6 7
>>
>> StartsWithSmallerOrEqual=: ([: {.@> ])<:[: {: [
>>
>> Shorter=: ([: #@> ])<[: {. [
>>
>> LengthAndFirstElement=: [: (# , {.) [: > ]
>>
>> SelectNotShorterAndStartsWithSmallerOrEqual=: (([: 
>> LengthAndFirstElement [: {: ]) ( ([: -. Shorter 
>> *.StartsWithSmallerOrEqual) # ]) [: > [: {. ]) , [: {: ]
>>
>> SelectNotShorterAndStartsWithSmallerOrEqual ((<1 2),(<3 4 5),(< 4 
>> 5),(< 1 4 5));2 6 7
>>
>> DoBetweenElementsInFold=: [: 
>> SelectNotShorterAndStartsWithSmallerOrEqual ] ; [ 
>> AddGroupWithLeftIfNoGroups [ PrependLeftInGroups [: 
>> SelectFirstGroupOfMaxLength SelectGroupsWithLeftLessThanFirstElement
>>
>> 2 DoBetweenElementsInFold (<1 2 3),<4 5
>>
>> LongestIncreasingSubsequence=: [: ; [: SelectFirstGroupOfMaxLength [: 
>> > [: DoBetweenElementsInFold&.:>/ PackElements , 
>> GroupOfEmptyGroupInitialState
>>
>> LongestIncreasingSubsequence=: LongestIncreasingSubsequence f.
>>
>> LongestIncreasingSubsequence 6 1 3 4 2 8
>>
>> l =: 7 4 4 5 2 7 1 8 13 2 10 4 9 1 4 5 5 4 3 10 3 4 5 8 15 7 11 19
>>
>> LongestIncreasingSubsequence l
>>
>> 9!:1 [16807
>>
>> LongestIncreasingSubsequence 1000?1000
>>
>> 9!:1 [16807
>>
>> LongestIncreasingSubsequence ?1000$1000
>>
>> ts=: 6!:2 , 7!:2@] NB. Time and space
>>
>> ts'LongestIncreasingSubsequence 1000?1000'
>>
>> ts'LongestIncreasingSubsequence ?1000$1000'
>>
>> ts'LongestIncreasingSubsequence 10000?10000'
>>
>> ts'LongestIncreasingSubsequence ?10000$10000'
>>
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus



More information about the Programming mailing list