/// <summary> /// Overloaded method for 16-bits Integer Distances /// </summary> public static Int16 GetMinDistance(string source, string destination, EditDistanceCostsMap<Int16> distances) { // Validate parameters and TCost. if (source == null || destination == null || distances == null) throw new ArgumentNullException("Some of the parameters are null."); else { var longDistance = new EditDistanceCostsMap<long>( insertionCost: Convert.ToInt64(distances.InsertionCost), deletionCost: Convert.ToInt64(distances.DeletionCost), substitutionCost: Convert.ToInt64(distances.InsertionCost)); return Convert.ToInt16(EditDistance.GetMinDistance(source, destination, longDistance)); } }
/// <summary> /// Computes the Minimum Edit Distance between two strings. /// </summary> public static Int64 GetMinDistance(string source, string destination, EditDistanceCostsMap<Int64> distances) { // Validate parameters and TCost. if (source == null || destination == null || distances == null) throw new ArgumentNullException("Some of the parameters are null."); else if (source == destination) return 0; // Dynamic Programming 3D Table long[,] dynamicTable = new long[source.Length + 1, destination.Length + 1]; // Initialize table for (int i = 0; i <= source.Length; ++i) dynamicTable[i, 0] = i; for (int i = 0; i <= destination.Length; ++i) dynamicTable[0, i] = i; // Compute min edit distance cost for (int i = 1; i <= source.Length; ++i) { for (int j = 1; j <= destination.Length; ++j) { if (source[i - 1] == destination[j - 1]) { dynamicTable[i, j] = dynamicTable[i - 1, j - 1]; } else { long insert = dynamicTable[i, j - 1] + distances.InsertionCost; long delete = dynamicTable[i - 1, j] + distances.DeletionCost; long substitute = dynamicTable[i - 1, j - 1] + distances.SubstitutionCost; dynamicTable[i, j] = Math.Min(insert, Math.Min(delete, substitute)); } } } // Get min edit distance cost return dynamicTable[source.Length, destination.Length]; }
public static void DoTest() { short minDistance = 0; // Initialize the costs map var costs = new EditDistanceCostsMap <short>(insertionCost: 1, substitutionCost: 1, deletionCost: 1); string one = ""; string two = ""; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is zero Debug.Assert(minDistance == 0); one = "I am Ahmad Alhour"; two = "Ahmad Alhour"; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is 5 Debug.Assert(minDistance == 5); one = "I am Ahmad Alhour"; two = ""; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is the length of string one (17 characters) Debug.Assert(minDistance == one.Length); one = "Thou shalt not kill"; two = "You should not murder"; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is 11 Debug.Assert(minDistance == 11); }
public static void DoTest() { short minDistance = 0; // Initialize the costs map var costs = new EditDistanceCostsMap<short>(insertionCost: 1, substitutionCost: 1, deletionCost: 1); string one = ""; string two = ""; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is zero Debug.Assert(minDistance == 0); one = "I am Ahmad Alhour"; two = "Ahmad Alhour"; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is 5 Debug.Assert(minDistance == 5); one = "I am Ahmad Alhour"; two = ""; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is the length of string one (17 characters) Debug.Assert(minDistance == one.Length); one = "Thou shalt not kill"; two = "You should not murder"; minDistance = EditDistance.GetMinDistance(one, two, costs); // Assert min cost is 11 Debug.Assert(minDistance == 11); }