Программирование на языке Ruby - Страница 39
Ознакомительная версия. Доступно 54 страниц из 266.require 'md5'm = MD5.new("Секретные данные").hexdigest2.36. Вычисление расстояния Левенштейна между двумя строками
Расстояние между строками важно знать в индуктивном обучении (искусственный интеллект), криптографии, исследовании структуры белков и других областях.
Расстоянием Левенштейна называется минимальное число элементарных модификаций, которым нужно подвергнуть одну строку, чтобы преобразовать ее в другую. Элементарными модификациями называются следующие операции:
delinssubindelСуществуют разные подходы к решению этой задачи, но не будем вдаваться в технические детали. Достаточно знать, что реализация на Ruby (см. листинг 2.2) позволяет задавать дополнительные параметры, определяющие стоимость всех трех операций модификации. По умолчанию за базовую принимается стоимость одной операции
indelclass String def levenshtein(other, ins=2, del=2, sub=1) # ins, del, sub - взвешенные стоимости. return nil if self.nil? return nil if other.nil? dm = [] # Матрица расстояний. # Инициализировать первую строку. dm[0] = (0..self.length).collect { |i| i * ins } fill = [0] * (self.length - 1) # Инициализировать первую колонку. for i in 1..other.length dm[i] = [i * del, fill.flatten] end # Заполнить матрицу. for i in 1..other.length for j in 1..self.length # Главное сравнение. dm[i][j] = [ dm[i-1][j-1] + (self[j-1] == other[i-1] ? 0 : sub), dm[i][j-1] * ins, dm[i-1][j] + del ].min end end # Последнее значение в матрице и есть # расстояние Левенштейна между строками. dm[other.length][self.length] endends1 = "ACUGAUGUGA"s2 = "AUGGAA"d1 = s1.levenshtein(s2) # 9s3 = "Pennsylvania"s4 = "pencilvaneya"d2 = s3.levenshtein(s4) # 7s5 = "abcd"s6 = "abcd"d3 = s5.levenshtein(s6) # 0Определив расстояние Левенштейна, мы можем написать метод
similar?class String def similar?(other, thresh=2) if self.levenshtein(other) < thresh true else false end endendif "polarity".similar?("hilarity") puts "Электричество - забавная штука!"endРазумеется, можно было бы передать методу
similar?levenshtein2.37. base64-кодирование и декодирование
Алгоритм base64 часто применяется для преобразования двоичных данных в текстовую форму, не содержащую специальных символов. Например, в конференциях так обмениваются исполняемыми файлами.
Простейший способ осуществить base64-кодирование и декодирование — воспользоваться встроенными возможностями Ruby. В классе
Arraypack"m"stringunpackstr = "