59 lines
3.3 KiB
C#
59 lines
3.3 KiB
C#
|
using System;
|
|||
|
using System.Diagnostics;
|
|||
|
|
|||
|
class EditDistance//Определяет класс EditDistance для вычисления редакционного расстояния между двумя строками.
|
|||
|
{
|
|||
|
static int Min(int a, int b, int c)//Вспомогательный метод, возвращающий минимальное из трех заданных целых чисел.
|
|||
|
{
|
|||
|
return Math.Min(Math.Min(a, b), c);
|
|||
|
}
|
|||
|
|
|||
|
static int EditDistanceDP(string str1, string str2)//Статический метод, который вычисляет редакционное расстояние между двумя строками str1 и str2 с использованием динамического программирования.Содержит двумерный массив dp для хранения вычисленных значений.
|
|||
|
{
|
|||
|
int m = str1.Length;
|
|||
|
int n = str2.Length;
|
|||
|
|
|||
|
int[,] dp = new int[m + 1, n + 1];//Инициализирует массив dp базовыми случаями: dp[i, 0] = i: Если строка str1 пуста, расстояние равно длине str2.dp[0, j] = j: Если строка str2 пуста, расстояние равно длине str1.
|
|||
|
|
|||
|
// Заполняем базовые случаи
|
|||
|
for (int i = 0; i <= m; i++)
|
|||
|
{
|
|||
|
for (int j = 0; j <= n; j++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
dp[i, j] = j; // Если первая строка пустая, расстояние - длина второй строки
|
|||
|
else if (j == 0)
|
|||
|
dp[i, j] = i; // Если вторая строка пустая, расстояние - длина первой строки
|
|||
|
else if (str1[i - 1] == str2[j - 1])
|
|||
|
dp[i, j] = dp[i - 1, j - 1]; // Если символы совпадают, берем значение из диагонали
|
|||
|
else
|
|||
|
dp[i, j] = 1 + Min(dp[i - 1, j], // Удаление
|
|||
|
dp[i, j - 1], // Вставка
|
|||
|
dp[i - 1, j - 1]); // Замена
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return dp[m, n];
|
|||
|
}
|
|||
|
|
|||
|
static void Main(string[] args)
|
|||
|
{
|
|||
|
string str1 = "кот";
|
|||
|
string str2 = "скат";
|
|||
|
|
|||
|
// Измерение времени выполнения
|
|||
|
Stopwatch stopwatch = new Stopwatch();
|
|||
|
stopwatch.Start();
|
|||
|
int distance = EditDistanceDP(str1, str2);
|
|||
|
stopwatch.Stop();
|
|||
|
Console.WriteLine("Редакционное расстояние между '{0}' и '{1}' равно {2}", str1, str2, distance);
|
|||
|
Console.WriteLine("Время выполнения: " + stopwatch.ElapsedMilliseconds + " миллисекунд");
|
|||
|
|
|||
|
// Измерение использования памяти
|
|||
|
Process currentProcess = Process.GetCurrentProcess();
|
|||
|
long memoryUsed = currentProcess.PrivateMemorySize64 / (1024 * 1024); // Переводим байты в мегабайты
|
|||
|
|
|||
|
Console.WriteLine("Редакционное расстояние между '{0}' и '{1}' равно {2}", str1, str2, EditDistanceDP(str1, str2));
|
|||
|
}
|
|||
|
}
|