[Jprogramming] Greatest Increasing Subsequence

Henry Rich henryhrich at gmail.com
Sat Sep 10 13:27:39 UTC 2016


(x I. y) does use binary search, and requires that y be either 
nonincreasing or nondecreasing.

Length of names has a tiny effect on performance, as the interpreter has 
to compare the name against a stored name.  It is barely noticeable; 
slightly more noticeable when J8.05 added a fast path for singleton 
operations; disappears for local names now that J8.05 prehashes names 
assigned by local assignment.  Not worth mentioning, except that the 
difference between the two programs was so small.

Henry Rich

On 9/10/2016 3:58 AM, 'Mike Day' via Programming wrote:
> Yes.  It clearly saves space to have "valueofminendvalue",  my "mx",  
> grow
> as it needs, rather than to start with maximal length.  I hadn't 
> spotted how
> to avoid indexed assignment when your "j", my "lo",  increases. No need
> for those clunky _1s in the index array!
>
> So then I'm surprised that my space-hungry version doesn't suffer a hit
> on the performance of dyadic I. on the maximal length mx .  Does it 
> use binary
> search?
>
> Also, has length of variable names affected performance in early J 
> versions?
> I'm just lazy and all thumbs, so have avoided long names!
>
> Thanks,
>
> Mike
>
> On 10/09/2016 00:39, Henry Rich wrote:
>> They're about the same speed on my machine.  I don't think the 
>> if-then-else is material.  They're essentially the same algorithm.
>>
>> (I'm testing on J8.05 beta, where the long names don't affect 
>> performance)
>>
>> Henry Rich
>>
>> On 9/9/2016 7:26 PM, 'Mike Day' via Programming wrote:
>>> 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
>>>
>>> ----------------------------------------------------------------------
>>> 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
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm



More information about the Programming mailing list