One thing I keep meaning to do, when i see stuff like this, is verify
that the various versions are giving the same results for the same
test arguments. (In the past, I have seen timing examples where we
were comparing timings on code that gave different results.)

I haven't done that here, yet, but I can recommend an approach. Something like:

   assert 1=#~.(lisI; lisJ; lisM; lisL; lisEH) a

Thanks,

-- 
Raul


On Fri, Sep 9, 2016 at 9:39 AM, Erling Hellenäs
<erl...@erlinghellenas.se> wrote:
> Hi all !
>
> I made a new version. The code is below. This is the present scoreboard:
>
> a=: 25 ? 25
>
> timespacex 'lisI a'
>
> 0.000296778 3584
>
> timespacex 'lisJ a'
>
> 0.000545234 3712
>
> timespacex 'lisM a'
>
> 0.000131711 10752
>
> timespacex 'lisL a'
>
> 0.000174047 11776
>
> timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> 0.0101456 247424
>
> timespacex 'lisEH a'
>
> 0.000304476 14208
>
>
> a=: 1000 ? 1000
>
> timespacex 'lisI a'
>
> 0.0226869 538880
>
> timespacex 'lisJ a'
>
> 0.0577798 1.13357e6
>
> timespacex 'lisM a'
>
> 0.0046749 45952
>
> timespacex 'lisL a'
>
> 0.161294 594176
>
> NB.timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> timespacex 'lisEH a'
>
> 0.236193 718720
>
>
> a=: 10000 ? 10000
>
> timespacex 'lisI a'
>
> 0.311934 1.69006e7
>
> timespacex 'lisJ a'
>
> 1.45356 2.31916e7
>
> timespacex 'lisM a'
>
> 0.04604 548736
>
> timespacex 'lisL a'
>
> 17.0889 1.31657e7
>
> NB.timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> timespacex 'lisEH a'
>
> 26.5314 1.44383e7
>
>
> It is hard to create a good tacit solution?
>
>
> Cheers,
>
> Erling
>
>
>
> NB.===========================================================================
>
>
> NB. Jon - bizarre version. Uses anonymous verbs for most of the logic.
>
> NB. Slow and, uses huge amounts of memory.
>
> appendOrInsert=:(3 : 'insert max' [ 3 :
> '(max=:<:#lst)[(min=:0)[val=:i{r[i=:y')`(3 : '(lst=:lst,y)[prev=:(_1{lst) y}
> prev')@.(3 : '(val>({:lst){r)[val=:y{r')
>
> insert=:(3 : '(prev=: ((y-1){lst)i}prev)[(lst=: i y }lst)' ] ])@:(3 :
> 'mid'`(3 : 'min=: mid+1')@.(3 :
> '(val>(mid{lst){r)[(mid=:<.(min+y)%2)')^:(0&<)^:_)
>
>
> lisJ =: 3 : 0
>
> r=:y NB. array
>
> [val=:0[max=:0[mid=:0[min=:0 NB. useful numbers
>
> lst=:0 NB. list of indices
>
> prev=: (#y)#0 NB. previous indices
>
> i=:0 NB. current index
>
>
> appendOrInsert"0 >: i.<: # y NB. append the items, or insert them, into lst
> (and update prev)
>
> res=:''
>
> ptr=: _1{lst
>
> (ptr&buildEx)^:(#lst) res
>
> |. res
>
> )
>
>
> buildEx =: 4 : 0
>
> res=:y,ptr{r
>
> ptr=: ptr{prev
>
> res
>
> )
>
>
>
> NB.===========================================================================
>
>
>
> NB. Imperative version. just for benchmarking
>
> lisI =: 3 : 0
>
> lst =: 0
>
> r=: y
>
> parent=: (#y)#0
>
> for_i.>:i.<:# r do.
>
> if.((i{r) > ({: lst){r ) do.
>
> parent=:(_1{lst) i}parent
>
> lst =: lst, i
>
> else.
>
> min=: 0
>
> max =: <:#lst
>
> while. min < max do.
>
> mid =: <. (min + max) % 2
>
> if. (i{r) > ((mid { lst{r)) do. min =: mid + 1
>
> else. max =: mid end.
>
> end.
>
> lst=: (i) max} lst
>
> parent=: ((max-1){lst)(i}) parent
>
> end.
>
> end.
>
> res=: ''
>
> ptr=: _1{lst
>
> while. (# res) < # lst do.
>
> res=:res,ptr{r
>
> ptr=:ptr{parent
>
> end.
>
> I. res
>
> )
>
>
>
>
> NB.===========================================================================
>
>
>
> NB. Mike's version.
>
>
> lisM =: 3 : 0
>
> n =. #x =. y
>
> if. 2>#x do. x return. end. NB. special case empty or singleton array
>
> if. (-:/:~)x do. ~.x return. end. NB. special case sorted arrays
>
> if. (-:\:~)x do. {.x return. end.
>
> p =. n#0
>
> NB. seed m with trailing _1 so that final L (as in wiki algorithm) can be
> found
>
> m =. n 0 } _1#~>:n
>
> NB. set up sorted mx, with just the first element of x, so that I. works
>
> mx =. ({.x) 1 } (<:<./x), n#>:>./x
>
> for_i. i.n do.
>
> xi =. i{x
>
> lo =. mx I. xi
>
> p =. (m{~<:lo) i } p NB. better than appending to short p for larger x
>
> m =. i lo } m
>
> mx =. xi lo } mx
>
> end.
>
> |. x{~(p{~])^:(i.L) m{~ L =. <: m i. _1
>
> )
>
>
> NB.===========================================================================
>
>
> NB. Louis' version.
>
> p=: ] , [ ,&.> ] #~ (< {.&>) (= >./)@:* #&>@]
>
> e=: }:@>@(#~ (= >./)@:(#&>))@>
>
>
> s=: [: e (<<_) p&.>/@,~ <"0
>
> pi=: ] , [ ,&.> ] {~ (< {.&>) (i. >./)@:* #&>@]
>
> lisL =: [: e (<<_) pi&.>/@,~ <"0 NB. <------------- this one.
>
>
> f=: ((] >: (-~ >./)) #&>) # ]
>
>
> P=: ] , [ ,&.> ] #~ (< {.&>) (,@[ #^:_1 (= >./)@#) #&>@]
>
> sp=: [: e (<<_) ({:@[ f {.@[ P ])&.>/@,~ (,&.> i.@#)
>
>
>
>
> NB.===========================================================================
>
>
>
> NB. Xiao's version with Raul's modifications. Renamed verbs to avoid
> clashing.
>
>
> NB. dyads
>
> exr=: (1 + {:@[ < ]) {. [ ; ,
>
> hxr=: [: ; exr&.>
>
>
> NB. monads
>
> gxr=: (}.@] ;~ {.@] ; (hxr {.))&>/
>
> cxr=: ({::~ [: (i. >./) #@>)@>@{.
>
> dxr=: (<_) ; ]
>
> lisXR=: ([: cxr gxr^:(#@(>@{:)))@dxr
>
>
> NB.===========================================================================
>
>
> NB. Erling's version
>
>
> GroupOfEmptyGroupInitialState=: [: < a:"_
>
> PackElements=: <@+
>
> SelectGroupsWithLeftLessThanFirstElement=: ([: , [ < [: (1 {. ])@> ]) # ]
>
> PrependLeftInGroups=: ([: < [) ,&.> ]
>
> AddGroupWithLeftIfNoGroups=: ((0 = [: # ]) {. [: < [) , ]
>
> SelectFirstGroupOfMaxLength=: ([: ((1 <. #) {. ]) [: I. ([: (] = '' $ [: >./
> ]) #@>)) { ]
>
> DoBetweenElementsInFold=: ] , [ AddGroupWithLeftIfNoGroups [
> PrependLeftInGroups [: SelectFirstGroupOfMaxLength
> SelectGroupsWithLeftLessThanFirstElement
>
> LongestIncreasingSubsequence=: [: ; [: SelectFirstGroupOfMaxLength [: > [:
> DoBetweenElementsInFold&.:>/ PackElements , GroupOfEmptyGroupInitialState
>
> lisEH=: LongestIncreasingSubsequence f.
>
>
> NB.===========================================================================
>
>
> a=: 25 ? 25
>
> timespacex 'lisI a'
>
> timespacex 'lisJ a'
>
> timespacex 'lisM a'
>
> timespacex 'lisL a'
>
> timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> timespacex 'lisEH a'
>
>
> a=: 1000 ? 1000
>
> timespacex 'lisI a'
>
> timespacex 'lisJ a'
>
> timespacex 'lisM a'
>
> timespacex 'lisL a'
>
> NB.timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> timespacex 'lisEH a'
>
>
> a=: 10000 ? 10000
>
> timespacex 'lisI a'
>
> timespacex 'lisJ a'
>
> timespacex 'lisM a'
>
> timespacex 'lisL a'
>
> NB.timespacex 'lisXR a' NB. comment out for larger arrays,a.
>
> timespacex 'lisEH a'
>
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to