From 7379741b54a72fc32e151e715788844ccbe627db Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Fri, 28 Nov 2014 10:19:10 -0800 Subject: [PATCH] z-algorithm: slightly faster by allocating and using an array. --- extra/z-algorithm/z-algorithm.factor | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/extra/z-algorithm/z-algorithm.factor b/extra/z-algorithm/z-algorithm.factor index bd312755a3f..93470203c52 100644 --- a/extra/z-algorithm/z-algorithm.factor +++ b/extra/z-algorithm/z-algorithm.factor @@ -1,38 +1,39 @@ ! Copyright (C) 2010 Dmitry Shubin. ! See http://factorcode.org/license.txt for BSD license. -USING: arrays combinators.smart kernel locals math math.ranges -sequences sequences.private ; +USING: arrays kernel locals math math.ranges sequences +sequences.private ; IN: z-algorithm : lcp ( seq1 seq2 -- n ) - [ min-length ] 2keep mismatch [ nip ] when* ; + [ min-length dup ] 2keep mismatch-unsafe [ nip ] when* ; Zk - Zk Z push seq Z + Zk k Z set-nth seq Z Zk 0 > [ k Zk k + 1 - ] [ l r ] if ; inline :: inside-zbox ( seq Z l r k -- seq Z l r ) k l - Z nth :> Zk' r k - 1 + :> b seq Z Zk' b < - [ Zk' Z push l r ] ! still inside + [ Zk' k Z set-nth l r ] ! still inside [ seq r 1 + seq b [ tail-slice ] 2bi@ lcp :> q - q b + Z push k q r + + q b + k Z set-nth k q r + ] if ; inline -: (z-value) ( seq Z l r k -- seq Z l r ) +: z-value ( seq Z l r k -- seq Z l r ) 2dup < [ out-of-zbox ] [ inside-zbox ] if ; inline :: (z-values) ( seq -- Z ) - V{ } clone 0 0 seq length :> ( Z l r len ) - len Z push [ seq Z l r 1 len [a,b) [ (z-value) ] each ] - drop-outputs Z ; inline + seq length dup 0 :> ( len Z ) + len 0 Z set-nth + seq Z 0 0 len [1,b) [ z-value ] each 4drop + Z ; inline PRIVATE> : z-values ( seq -- Z ) - dup length 0 > [ (z-values) ] when >array ; + [ { } ] [ (z-values) ] if-empty ;