On Wed, Oct 12, 2011 at 11:24 AM, I wrote:
> L=: 'label'
> D=: ,'p<label>0'8!:2 i.1e6
...
> F=:1 :0 NB. x: label, m: max labels to find, y: target
> :
>  b=.  2*m*#x  NB. block size to search (smaller for testing, larger
> for typical use)
>  r=. i.0      NB. result
>  for_block. |: b -~/\@(] <. [ * 0 1 +/i.@>.@%~) #y do.
>    if. m-:#r do. return. end.
>    'z b'=. block
>    r=. r, ({.~ (m-#r) <. #)z+x I.@E. y{~z+i.b
>  end.
> )

Please note that this has a bug in it.

The problem is that it does not properly deal with the case where a
label straddles a block boundary.

The fix is to extend each block by (#label)-1 characters.  For example
(untested code, sorry):

F=:1 :0 NB. x: label, m: max labels to find, y: target
:
 b=.  2*m*#x  NB. block size to search
 r=. i.0      NB. result
 ov=. 0, (#x)-1 NB. block overlap adjustment
 for_block. |: b -~/\@(] <. ov + [ * 0 1 +/i.@>.@%~) #y do.
   if. m-:#r do. return. end.
   'z b'=. block
   r=. r, ({.~ (m-#r) <. #)z+x I.@E. y{~z+i.b
 end.
)


FYI,

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to