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));
|
||
}
|
||
}
|