Sha256: e4f4303c056261011d6469de5e8c9fefe31b2f5e88d200904a2ecb896ea1aec7

Contents?: true

Size: 1.14 KB

Versions: 2

Compression:

Stored size: 1.14 KB

Contents

# coding: utf-8

module StringMetric
  module Levenshtein
    class Recursive
      def self.distance(from, to, options = {})
        return 0 if from == to
        return to.size if from.size.zero?
        return from.size if to.size.zero?

        max_distance      = options[:max_distance]
        insertion_cost    = options.fetch(:insertion_cost, 1)
        deletion_cost     = options.fetch(:deletion_cost, 1)
        substitution_cost = options.fetch(:substitution_cost, 1)

        if from.chars.to_a.last == to.chars.to_a.last
          cost = 0
        else
          cost = substitution_cost
        end

        if max_distance
          return [distance(from.chop, to, options) + deletion_cost,
                  distance(from, to.chop, options) + insertion_cost,
                  distance(from.chop, to.chop, options) + cost,
                  max_distance
                 ].min
        else
          return [distance(from.chop, to, options) + deletion_cost,
                  distance(from, to.chop, options) + insertion_cost,
                  distance(from.chop, to.chop, options) + cost
                 ].min

        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
string_metric-0.1.1 lib/string_metric/levenshtein/recursive.rb
string_metric-0.1.0 lib/string_metric/levenshtein/recursive.rb