3
$\begingroup$

I have implemented the Burrows-Wheeler Transform as below:

eofChar = FromCharacterCode[255];

BurrowsWheelerTransform[string_] :=
 With[{s = string <> eofChar},
  StringJoin @@ (StringPart[#, -1] & /@ Sort[NestList[
       StringRotateLeft[#, 1] &, s, StringLength[s] - 1]
      , LexicographicOrder])]

InverseBurrowsWheelerTransform[string_] :=
 With[{len = StringLength[string], c = Characters[string]},
  StringJoin @@ Most[SelectFirst[Nest[
      SortBy[Transpose[Prepend[Transpose[#], c]], 
        s |-> StringJoin @@ s, LexicographicOrder] &, {}, 
      len], #[[-1]] == eofChar &]]
  ]

bwt = BurrowsWheelerTransform["swiss miss is on a mission to mississippi"]
(*"nssaosn ss mwmsmp   oot ipississsiiiiiÿ si"*)

InverseBurrowsWheelerTransform[bwt]
(*"swiss miss is on a mission to mississippi"*)

However, this implementation is very slow for larger strings especially in the inverse transform. I suspect this is due to all this Transpose business with column insertion. Is there a better way to implement this?

$\endgroup$
1

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.