Расстояние Дамерау — Левенштейна (названо в честь учёных Фредерика Дамерау[англ.] и Владимира Левенштейна) — это мера разницы двух строк символов, определяемая как минимальное количество операций вставки, удаления, замены и транспозиции (перестановки двух соседних символов), необходимых для перевода одной строки в другую. Является модификацией расстояния Левенштейна: к операциям вставки, удаления и замены символов, определённых в расстоянии Левенштейна добавлена операция транспозиции (перестановки) символов.

Алгоритм

править

Расстояние Дамерау — Левенштейна между двумя строками и определяется функцией как:

где это индикаторная функция, равная нулю при и 1 в противном случае.

Каждый рекурсивный вызов соответствует одному из случаев:

  • соответствует удалению символа (из a в b),
  • соответствует вставке (из a в b),
  • соответствие или несоответствие, в зависимости от совпадения символов,
  • в случае перестановки двух последовательных символов.

Реализации

править

На C#[1]

private static int DamerauLevenshteinDistance(string str1, string str2)
{
    int len1 = str1.Length;
    int len2 = str2.Length;

    char[] arr1 = str1.ToCharArray();
    char[] arr2 = str2.ToCharArray();

    int[,] matrix = new int[len1 + 1, len2 + 1];

    // Инициализация первой строки и первого столбца
    for (int i = 0; i <= len1; i++)
    {
        matrix[i, 0] = i;
    }
    for (int j = 0; j <= len2; j++)
    {
        matrix[0, j] = j;
    }

    // Заполнение матрицы
    for (int i = 1; i <= len1; i++)
    {
        for (int j = 1; j <= len2; j++)
        {
            int cost = (arr1[i - 1] == arr2[j - 1]) ? 0 : 1;

            matrix[i, j] = Math.Min(
                    matrix[i - 1, j] + 1, // Удаление
                    Math.Min(
                            matrix[i, j - 1] + 1, // Вставка
                            matrix[i - 1, j - 1] + cost // Замена
                    )
            );

            // Проверка на перестановку
            if (i > 1 && j > 1 && arr1[i - 1] == arr2[j - 2] && arr1[i - 2] == arr2[j - 1])
            {
                matrix[i, j] = Math.Min(matrix[i,j], matrix[i - 2, j - 2] + cost);
            }
        }
    }

    return matrix[len1, len2];
}

См. также

править

Примечания

править
  1. BillWagner. Обзор - A tour of C# (рус.). learn.microsoft.com. Дата обращения: 25 февраля 2026.

Ссылки

править

📚 Artikel Terkait di Wikipedia

W-функция Ламберта

\left\{{\begin{matrix}0{,}665\cdot (1+0{,}0195\ln(x+1))\ln(x+1)+0{,}04&\ :\ &0<x\leq 500\\\ln(x-4)-(1-{1 \over \ln x})\ln \ln x&\ :\ &x>500\\\end{matrix}}\right

MATLAB

MATLAB (сокращение от англ. «Matrix Laboratory», в русском языке произносится как Матла́б) — платформа для программирования и пакет прикладных программ

Метод Ньютона

// производная функции using function = double (*)(double x); // задание типа function double solve(function fx, function dfx, double x0) { double x1 =

Фазовая диаграмма воды

20666667 ; a 3 = − 6 , 1059813 ; b 3 = 1 , 70333333. {\displaystyle {\begin{matrix}~P_{0}=611,657~\mathrm {Pa} ;&T_{0}=273,16~\mathrm {K} ;\\a_{1}=-21,2144006;&b_{1}=0

Целая часть

{\displaystyle {\begin{matrix}\lfloor 2{,}7\rfloor =2,&\lfloor -2{,}7\rfloor =-3,\\\lceil 2{,}7\rceil =3,&\lceil -2{,}7\rceil =-2.\end{matrix}}} Функция «пол»

Гауссова функция

, где матрица: [ a b b c ] {\displaystyle \left[{\begin{matrix}a&b\\b&c\end{matrix}}\right]} положительно определена. Вариант гауссовой функции в

Гипотеза Гильберта — Пойи

Zeev; Sarnak, Peter (1996), «Zeros of Principal L-functions and Random Matrix Theory», Duke Journal of Mathematics, 81 (2): 269—322, doi:10.1215/s0012-7094-96-08115-6

TypeScript

модуля «crypto», встроенного в Node.js: import * as crypto from "crypto"; function generate(length: number = 16) : string { const uppercase: string =