From e62da0bc64b61313a828ac8b1df118fbcdc7db29 Mon Sep 17 00:00:00 2001 From: John Benediktsson <mrjbq7@gmail.com> Date: Tue, 5 May 2015 16:08:55 -0700 Subject: [PATCH] math.transforms.bwt: faster version of bwt if only needing transform. --- extra/math/transforms/bwt/bwt-tests.factor | 4 +++- extra/math/transforms/bwt/bwt.factor | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/extra/math/transforms/bwt/bwt-tests.factor b/extra/math/transforms/bwt/bwt-tests.factor index 9491bf644e..0a02db2d65 100644 --- a/extra/math/transforms/bwt/bwt-tests.factor +++ b/extra/math/transforms/bwt/bwt-tests.factor @@ -1,6 +1,8 @@ ! Copyright (C) 2012 John Benediktsson ! See http://factorcode.org/license.txt for BSD license -USING: tools.test ; +USING: kernel tools.test ; IN: math.transforms.bwt { "asdf" } [ "asdf" bwt ibwt ] unit-test + +{ t } [ "hello" [ bwt nip ] [ bwt* ] bi = ] unit-test diff --git a/extra/math/transforms/bwt/bwt.factor b/extra/math/transforms/bwt/bwt.factor index 35844580e5..d3cecea39c 100644 --- a/extra/math/transforms/bwt/bwt.factor +++ b/extra/math/transforms/bwt/bwt.factor @@ -1,10 +1,17 @@ ! Copyright (C) 2012 John Benediktsson ! See http://factorcode.org/license.txt for BSD license -USING: assocs fry kernel sequences sequences.rotated sorting ; +USING: accessors assocs fry kernel math sequences +sequences.rotated sorting suffix-arrays.private ; IN: math.transforms.bwt ! Semi-efficient versions of Burrows-Wheeler Transform +: bwt* ( seq -- newseq ) + [ + dup suffixes natural-sort + [ dup from>> [ to>> ] [ nip ] if-zero 1 - over nth ] + ] [ map-as ] bi nip ; + : bwt ( seq -- i newseq ) dup all-rotations natural-sort [ [ sequence= ] with find drop ]