On Sun, 18 Dec 2016 23:48:10 -0800
Paul Eggert <egg...@cs.ucla.edu> wrote:

> >> 'delete' is
> >> O(N); 'replace' calls 'delete' in a loop and is therefore O(N**2).
> >> 'epsclosure' calls 'replace' in a loop and so I suppose it is O(N**3).
> >> I haven't looked into how likely the worst-case performance is, though.
> 
> > Yes.  It is same both before and after with my proposed patch, but It
> > seems that memset() for VISITED causes slowdown in before code.
> 
> I looked into it some more. Your patch looks like a win so I
> installed it; thanks. Also, I improved the worst-case performance for
> 'replace' from O(N*(N + log N)) to O(N log N), by installing the
> attached patch. I also bumped grep's gnulib version so that it gets
> this patch.
> 
> This doesn't address the main problem in this area, as 'grep' is
> still pretty slow with lots of multiple patterns. However, one step
> at a time.

Thanks.

BTW, What case do you the worst?  One more I think previous 'replace' is
not O(N*(N + log N)) but O(N + N log N) i.e. O(N log N) .

> This doesn't address the main problem in this area, as 'grep' is still
> pretty slow with lots of multiple patterns. However, one step at a time.

Yes, I think slowness with lots of multiple patterns is caused by two
reasons mainly.

 1. dfa is not optimize parsed patterns.

    For example, dfa does not replace pattern 'a \|a \|a \| ... \|a \|b'
    to 'a \|b'.

    I tried it several times, have not succeeded it yet.

 2. grep matcher compiles regex always to check syntax of a pattern,
    even when it is not used in searching.

    I also tried it, have not succeeded it yet.


Reply via email to