Algorithms, Software Development

Making Sense of the Damerau-Levenshtein Distance Algorithm

Imagine you’re writing an email, and you accidentally type “hte” instead of “the.” Your computer’s spell-checker catches the mistake and corrects it for you. How does it do that? One way is by using the Damerau-Levenshtein distance algorithm.

The Damerau-Levenshtein distance algorithm is a clever way to measure how “close” two words are to each other. It calculates the minimum number of single-character edits (insertions, deletions, substitutions, or transpositions) required to change one word into the other. In this blog post, we’ll break down the algorithm in simple terms and provide an example using C#.

Let’s start with a simple example: comparing the words “kitten” and “sitting.” According to the Damerau-Levenshtein distance algorithm, the distance between them is 3:

  1. Substitute “s” for “k” in “kitten” -> “sitten”
  2. Substitute “i” for “e” in “sitten” -> “sittin”
  3. Insert “g” at the end of “sittin” -> “sitting”

Now that we understand the concept, let’s see how to implement this algorithm in C#. Here’s a straightforward example:

using System;

public class DamerauLevenshtein
{
    public static int Distance(string a, string b)
    {
        int lenA = a.Length;
        int lenB = b.Length;
        int[,] d = new int[lenA + 1, lenB + 1];

        for (int i = 0; i <= lenA; i++)
            d[i, 0] = i;
        for (int j = 0; j <= lenB; j++)
            d[0, j] = j;

        for (int i = 1; i <= lenA; i++)
        {
            for (int j = 1; j <= lenB; j++)
            {
                int cost = (a[i - 1] == b[j - 1]) ? 0 : 1;

                d[i, j] = Math.Min(
                    Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1),
                    d[i - 1, j - 1] + cost);

                if (i > 1 && j > 1 && a[i - 1] == b[j - 2] && a[i - 2] == b[j - 1])
                    d[i, j] = Math.Min(d[i, j], d[i - 2, j - 2] + cost);
            }
        }

        return d[lenA, lenB];
    }
}

This implementation of the Damerau-Levenshtein distance algorithm is relatively easy to understand. It uses a matrix (2D array) to store intermediate distances between substrings of the input words. The matrix is filled row by row, with each cell’s value being calculated based on its neighbors.

The final distance between the two words is stored in the bottom-right cell of the matrix. You can test this implementation with the following code:

public static void Main()
{
    string word1 = "kitten";
    string word2 = "sitting";
    int distance = DamerauLevenshtein.Distance(word1, word2);
    Console.WriteLine($"The Damerau-Levenshtein distance between \"{word1}\" and \"{word2}\" is {distance}.");
}

That’s it! Now you have a better understanding of the Damerau-Levenshtein distance algorithm and how it can be implemented in C#. With this knowledge, you can apply the algorithm to various applications, like spell-checkers, search engines, or even DNA sequence comparison.

Feel free to play around with the code and test it with different word pairs to see how the algorithm calculates the distance between them. The Damerau-Levenshtein distance algorithm is a powerful and versatile tool to have in your programming toolkit, and understanding it can open up new possibilities in your projects.