It depends on whether the sequence will converge. try (1 2 3 4 5 6){~^:(5&>)^:(0) 1 (1 2 3 4 5 6){~^:(5&>)^:(1) 1 (1 2 3 4 5 6){~^:(5&>)^:(2) 1 (1 2 3 4 5 6){~^:(5&>)^:(3) 1 etc.
Ср, 07 сен 2016, jprogramming написал(а): > This also runs out of memory: > > (1 2 3 4 5 6){~^:(5&>)^:(_) 1 > |out of memory > | (1 2 3 4 5 6) {~^:(5&>)^:(_)1 > > whereas this doesn't > {&(1 2 3 4 5 6)^:(5&>)^:(_)1 > > > Wouldn't this imply the bug (if there is a bug) is not in the boxed integer? > > System details: > > Engine: j804/j64/windows > Release: commercial/2015-12-21 16:18:48 > Library: 8.04.15 > Qt IDE: 1.4.10/5.4.2 > Platform: Win 64 > Installer: J804 install > > > -------------------------------------------- > On Wed, 9/7/16, 'Jon Hough' via Programming <programm...@jsoftware.com> wrote: > > Subject: Re: [Jprogramming] Greatest Increasing Subsequence > To: programm...@jsoftware.com > Date: Wednesday, September 7, 2016, 6:30 PM > > " It appears that <n is being > interpreted > as <_ regardless of n." > > I'm not sure this is the case, for any left hand verb. > ]^:(<4) 4 > works fine. > > > -------------------------------------------- > On Wed, 9/7/16, Henry Rich <henryhr...@gmail.com> > wrote: > > Subject: Re: [Jprogramming] Greatest Increasing > Subsequence > To: programm...@jsoftware.com > Date: Wednesday, September 7, 2016, 6:05 PM > > I noticed this the other > day. It appears that <n is being interpreted > as <_ regardless of n. I'll look into > it. > > Henry Rich > > On 9/6/2016 11:53 PM, > Xiao-Yong Jin wrote: > > I’m trying to > rewrite lisM in a readable tacit form but hit something I > didn’t understand. > > Supplying i.n to > ^: works fine, but <n does not work like the dictionary > says. Namely > > > > > (_1+i.5){~^:(i.4)4 > > > > produces 4 3 2 1, but > > > > > (_1+i.5){~^:(<4)4 > > > > exhausts all the memory with J804 and > J805beta. > > > > The > dictionary says > > > > > If n is boxed it must be an atom, and u^:(<m) > > ↔ u^:(i.m) y > if m is a non-negative integer > > > > so the above two > should be the same. What’s going on here? > > > >> On Sep 5, 2016, > at 3:17 AM, 'Mike Day' via Programming <programm...@jsoftware.com> > wrote: > >> > >> > Thanks Jon > >> > >> > lisM isn't really "my" version - I was just > translating the pseudo-code... > >> I > expect -without checking! - that its advantage over lisl > resides in avoiding the do-it-yourself binary search by > using J's built-in dyadic I. , albeit at the expense of > an explicit sorted array, which I called mx . I > tried limiting the I. search to only the first L items of > mx, but with no benefit, at least for the sizes I > tried. > >> The time taken to recover > the result is fairly trivial, so I don't suppose my > use of > >> |. x{~(p{~])^:(i.L) L{m > >> is particularly interesting, but it > avoided that explicit while loop. > >> > >> Mike > >> > >> Please reply > to mike_liz....@tiscali.co.uk. > >> Sent from my iPad > >> > >>> On 5 Sep > 2016, at 08:07, 'Jon Hough' via Programming <programm...@jsoftware.com> > wrote: > >>> > >>> Just out of interest, I compared > the various results. > >>> I wrote a > fully imperative version, which uses in-place modification > of the results array. > >>> > >>> I also wrote a version that avoids > any while / for loops (because I wanted to avoid using > them), and ended up putting > >>> > most of the logic in anonymous verbs. Which is probably a > big mistake because that gets very slow. Also barely > readable. > >>> > >>> > > 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.=========================================================================== > >>> > >>> 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. > >>> > >>> > Playing around with various arrays, it seems lisM is the > most efficient in time and space (more than the imperative > version). > >>> lisM and lisI can > handle array larger than 10000. The others struggle or > give > up with them. > >>> > >>> > >>> > -------------------------------------------- > >>> On Sun, 9/4/16, 'Mike Day' > via Programming <programm...@jsoftware.com> > wrote: > >>> > >>> Subject: Re: [Jprogramming] > Greatest Increasing Subsequence > >>> > To: programm...@jsoftware.com > >>> Date: Sunday, September 4, 2016, > 4:30 AM > >>> > >>> This version of > >>> "lis" is a bit more > J-like, especially in using > >>> > dyadic I. > >>> instead of the diy > binary search, > >>> at the expense > of a slightly more > >>> complicated > set-up for the m and mx arrays. > >>> > >>> lis > =: 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 > >>> ) > >>> > >>> > Mike > >>> > >>> > >>> On > 02/09/2016 20:45, 'Mike > >>> > Day' via Programming wrote: > >>>> Well, > >>> assuming for now that it does > work, here's an attempt > >>> > at a J > >>>> version of > >>> the pseudo-code listed at > >>>> > https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms > >>>> > >>>> lis =: 3 : 0 NB. > longest > >>> increasing > subsequence > >>>> m > >>> =. > 0#~>:n =. > >>> > #x =. y > >>>> L > >>> =. #p =. > '' > >>>> mx =. > m{x NB. added this vector > >>> for > better look-up of x{~mid{m > >>>> > for_i. > >>> i.n do. > >>>> 'lo hi' =. > >>> 1, L > >>>> xi > =. i{x > >>>> > while. lo <: hi do. > >>>> mid =. >.@-: lo + > hi > >>> NB. if. xi > > x{~ mid{m do. NB. next > >>> line a > bit better > >>> if. xi > > mid{mx do. > >>> > lo =. >: mid > >>> > else. > >>>> > hi =. > >>> <: > mid > >>>> end. > >>>> end. > >>>> p > >>> =. p, m{~<:lo > >>>> m > >>> =. i lo } m > >>>> mx > >>> =. xi lo } mx > NB. update my additional array > >>>> L > =. L >. lo > >>>> > NB. smoutput i; (x{.~ >:i); > >>> > L{.m NB. diagnostic > >>> end. > >>>> |. x{~(p{~])^:(i.L) L{m > >>>> ) > >>>> > >>>> It's reasonably fast on > ?10000#5000 - > >>> but possibly > wrong!It does > >>>> fail on an > >>> empty array. > >>> Mike > >>>> > >>>>> On 02/09/2016 17:30, Raul > Miller wrote: > >>>>> It seems > to me that the > >>> "efficient > algorithm" documented on the > >>>>> wikipedia page would have > an analogous > >>> flaw. It is > performing binary > >>> searches on > unsorted lists. That said, it does perform > >>> correctly for > >>>>> this example. > >>>>> > >>>>> Thanks, > >>>> > >>>> --- > >>>> 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 > >>> > >>> > --- > >>> 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 > >> > ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm -- regards, ==================================================== GPG key 1024D/4434BAB3 2008-08-24 gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3 gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm