2024-05-01 12:26:51 +04:00

59 lines
3.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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