Sha256: 4a7fdc316c701af0cbb7961040db441512dbef55f96118131017c1e3b6f70f8c

Contents?: true

Size: 1.34 KB

Versions: 3

Compression:

Stored size: 1.34 KB

Contents

# coding: utf-8

module StringMetric
  module Levenshtein
    class IterativeWithTwoMatrixRows
      def self.distance(from, to, options = {})
        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)

        m = from.length
        n = to.length

        if max_distance && (n - m).abs >= max_distance
          return max_distance
        end

        return 0 if from == to
        return n if m.zero?
        return m if n.zero?

        v0 = (0..m).to_a
        x = 0

        n.times do |i|
          current = x = i + 1
          sub_cell = v0[0]

          m.times do |j|
            cost = (from[j] == to[i]) ? 0 : substitution_cost

            ins_cell = v0[j+1]

            x = [current + deletion_cost,   # deletion
                 ins_cell + insertion_cost, # insertion
                 sub_cell + cost            # substitution
                ].min

            v0[j] = current
            current = x
            sub_cell = ins_cell
          end

          v0[m] = x
          break if max_distance && v0.min > max_distance
        end

        if max_distance && x > max_distance
          max_distance
        else
          x
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
string_metric-0.1.4 lib/string_metric/levenshtein/iterative_with_two_matrix_rows.rb
string_metric-0.1.3 lib/string_metric/levenshtein/iterative_with_two_matrix_rows.rb
string_metric-0.1.2 lib/string_metric/levenshtein/iterative_with_two_matrix_rows.rb