Slide 1

Slide 1 text

MY FAVOURITE ALGORITHM @tomstuart / BaRuCo / 2014-09-12

Slide 2

Slide 2 text

BURROWS— WHEELER TRANSFORM

Slide 3

Slide 3 text

B A N A N A

Slide 4

Slide 4 text

B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A

Slide 5

Slide 5 text

B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A

Slide 6

Slide 6 text

B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A B A N A N A N N A B A A “NNBAAA”

Slide 7

Slide 7 text

def burrows_wheeler(string) chars = string.chars ! chars.each_index. map(&chars.method(:rotate)). sort.map(&:last).join end

Slide 8

Slide 8 text

>> string = 'banana' => "banana"

Slide 9

Slide 9 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"]

Slide 10

Slide 10 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"] ! >> chars.each_index ! ! => #

Slide 11

Slide 11 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"] ! >> chars.each_index. map(&chars.method(:rotate)) ! => [ ["b", "a", "n", "a", "n", "a"], ["a", "n", "a", "n", "a", "b"], ["n", "a", "n", "a", "b", "a"], ["a", "n", "a", "b", "a", "n"], ["n", "a", "b", "a", "n", "a"], ["a", "b", "a", "n", "a", "n"] ]

Slide 12

Slide 12 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"] ! >> chars.each_index. map(&chars.method(:rotate)). sort => [ ["a", "b", "a", "n", "a", "n"], ["a", "n", "a", "b", "a", "n"], ["a", "n", "a", "n", "a", "b"], ["b", "a", "n", "a", "n", "a"], ["n", "a", "b", "a", "n", "a"], ["n", "a", "n", "a", "b", "a"] ]

Slide 13

Slide 13 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"] ! >> chars.each_index. map(&chars.method(:rotate)). sort.map(&:last) => ["n", "n", "b", "a", "a", "a"]

Slide 14

Slide 14 text

>> string = 'banana' => "banana" ! >> chars = string.chars => ["b", "a", "n", "a", "n", "a"] ! >> chars.each_index. map(&chars.method(:rotate)). sort.map(&:last).join => "nnbaaa"

Slide 15

Slide 15 text

>> burrows_wheeler('banana') => "nnbaaa" >> burrows_wheeler('The rain in Spain stays mainly in the plain') => "nnyseenn nrplmthhtT aa aapn iiiiiiS y s la"

Slide 16

Slide 16 text

!

Slide 17

Slide 17 text

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? “NNBAAA”

Slide 18

Slide 18 text

A B A N A N ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? “NNBAAA”

Slide 19

Slide 19 text

? A ? ? ? ? ? B ? ? ? ? ? ? A ? ? ? ? ? ? N ? ? ? ? ? ? A ? ? ? ? ? ? N “NNBAAA”

Slide 20

Slide 20 text

? A ? ? ? ? ? B ? ? ? ? ? ? A ? ? ? ? ? ? N ? ? ? ? ? ? A ? ? ? ? ? ? N “NNBAAA”

Slide 21

Slide 21 text

A B A N A N B ? ? ? ? A ? ? ? ? ? N ? ? ? ? ? A ? ? ? ? ? N ? ? ? ? ? A “NNBAAA”

Slide 22

Slide 22 text

? A B ? ? ? ? B A ? ? ? ? ? A N ? ? ? ? ? N A ? ? ? ? ? A N ? A ? ? ? N “NNBAAA”

Slide 23

Slide 23 text

? A B ? ? ? ? B A ? ? ? ? ? A N ? ? ? ? ? N A ? ? ? ? ? A N ? A ? ? ? N “NNBAAA”

Slide 24

Slide 24 text

A B A N A N B A ? ? ? A N ? ? ? ? N A ? ? ? ? A N ? ? ? ? N A B ? ? ? A “NNBAAA”

Slide 25

Slide 25 text

? A B A ? ? ? B A N ? ? ? ? A N A ? ? ? ? N A N ? A ? ? A N ? A B ? ? N “NNBAAA”

Slide 26

Slide 26 text

? A B A ? ? ? B A N ? ? ? ? A N A ? ? ? ? N A N ? A ? ? A N ? A B ? ? N “NNBAAA”

Slide 27

Slide 27 text

A B A N A N B A N ? ? A N A ? ? ? N A N ? ? ? A N A B ? ? N A B A ? ? A “NNBAAA”

Slide 28

Slide 28 text

? A B A N ? ? B A N A ? ? ? A N A N ? A ? N A N ? A B ? A N ? A B A ? N “NNBAAA”

Slide 29

Slide 29 text

? A B A N ? ? B A N A ? ? ? A N A N ? A ? N A N ? A B ? A N ? A B A ? N “NNBAAA”

Slide 30

Slide 30 text

A B A N A N B A N A ? A N A N ? ? N A N A B ? A N A B A ? N A B A N ? A “NNBAAA”

Slide 31

Slide 31 text

? A B A N A ? B A N A N ? A A N A N ? A B N A N ? A B A A N ? A B A N N “NNBAAA”

Slide 32

Slide 32 text

? A B A N A ? B A N A N ? A A N A N ? A B N A N ? A B A A N ? A B A N N “NNBAAA”

Slide 33

Slide 33 text

A A N N B A N A N B N A N A B A A N A B A N A A “NNBAAA” B A A N A N A B A N N A

Slide 34

Slide 34 text

A A N N B A N A N B N A N A B A A N A B A N A A “NNBAAA” B A N A N A B A A N A N A B A N N A

Slide 35

Slide 35 text

def inverse_burrows_wheeler(string) chars = string.chars ! chars. inject([]) { |table| chars.zip(table).sort }. map(&:join) end

Slide 36

Slide 36 text

>> inverse_burrows_wheeler('nnbaaa') => ["abanan", "anaban", "ananab", "banana", "nabana", "nanaba"]

Slide 37

Slide 37 text

>> inverse_burrows_wheeler('nnyseenn nrplmthhtT aa aapn iiiiiiS y s la')
 => [" Spain stays mainly in the plainThe rain in", " in Spain stays mainly in the plainThe rain", " in the plainThe rain in Spain stays mainly", " mainly in the plainThe rain in Spain stays", " plainThe rain in Spain stays mainly in the", " rain in Spain stays mainly in the plainThe", " stays mainly in the plainThe rain in Spain", " the plainThe rain in Spain stays mainly in", "Spain stays mainly in the plainThe rain in ", "The rain in Spain stays mainly in the plain", "ain in Spain stays mainly in the plainThe r", "ain stays mainly in the plainThe rain in Sp", "ainThe rain in Spain stays mainly in the pl", "ainly in the plainThe rain in Spain stays m", "ays mainly in the plainThe rain in Spain st", "e plainThe rain in Spain stays mainly in th", "e rain in Spain stays mainly in the plainTh", "he plainThe rain in Spain stays mainly in t", "he rain in Spain stays mainly in the plainT", "in Spain stays mainly in the plainThe rain ", "in in Spain stays mainly in the plainThe ra", "in stays mainly in the plainThe rain in Spa", "in the plainThe rain in Spain stays mainly ", "inThe rain in Spain stays mainly in the pla", "inly in the plainThe rain in Spain stays ma", "lainThe rain in Spain stays mainly in the p", "ly in the plainThe rain in Spain stays main", "mainly in the plainThe rain in Spain stays ", "n Spain stays mainly in the plainThe rain i", "n in Spain stays mainly in the plainThe rai", "n stays mainly in the plainThe rain in Spai", "n the plainThe rain in Spain stays mainly i", "nThe rain in Spain stays mainly in the plai", "nly in the plainThe rain in Spain stays mai", "pain stays mainly in the plainThe rain in S", "plainThe rain in Spain stays mainly in the ", "rain in Spain stays mainly in the plainThe ", "s mainly in the plainThe rain in Spain stay", "stays mainly in the plainThe rain in Spain ", "tays mainly in the plainThe rain in Spain s", "the plainThe rain in Spain stays mainly in ", "y in the plainThe rain in Spain stays mainl", "ys mainly in the plainThe rain in Spain sta"]

Slide 38

Slide 38 text

def burrows_wheeler(string) chars = string.chars + ['$'] ! chars.each_index. map(&chars.method(:rotate)). sort.map(&:last).join end ! def inverse_burrows_wheeler(string) chars = string.chars ! chars. inject([]) { |table| chars.zip(table).sort }. map(&:join).detect { |s| s.end_with?('$') }.chop end

Slide 39

Slide 39 text

>> burrows_wheeler('banana')
 => "annb$aa" ! >> inverse_burrows_wheeler('annb$aa')
 => "banana" ! >> burrows_wheeler('The rain in Spain stays mainly in the plain')
 => "nnyseennn $rplmthhtT aa aapn iiiiiiS y s la" ! >> inverse_burrows_wheeler('nnyseennn $rplmthhtT aa aapn iiiiiiS y s la')
 => "The rain in Spain stays mainly in the plain"

Slide 40

Slide 40 text

thanks! @tomstuart / [email protected]