diff --git a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h index 3c021375369d5430527ea0ca59cf9860ea4f0f5b..54a881e4c1e502a29e8fc4d377b7bc43da206e7e 100644 --- a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h +++ b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h @@ -9,6 +9,7 @@ #define _LEVENSHTEIN_DYNAMIC_PROGRAMMING_H__ #include <algorithm> +#include <limits.h> #include <string/LinearString.h> @@ -46,13 +47,14 @@ ext::vector<ext::vector<unsigned int>> LevenshteinDynamicProgramming::compute_ta value_a = table[j-1][i-1] + 1; } - unsigned int value_b; + unsigned int value_b = UINT_MAX; if(j < pattern.getContent().size()) { value_b = table[j][i-1] + 1; - } else { - value_b = table[j-1][i] + 1; } + value_b = std::min(table[j-1][i] + 1, value_b); + + table[j][i] = std::min({value_a, value_b}); } } diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp index 804fa8f36577a657f73b7d3bfb91df7554519150..a87f8f14cc88e6f6fbea43791ac9a859a1fd45aa 100644 --- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp +++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp @@ -11,23 +11,13 @@ void LevenshteinDynamicProgrammingTest::testTableConstruction() { auto pattern = string::LinearString<>("adbbca"); ext::vector<ext::vector<unsigned int>> expected_result = { - ext::vector<unsigned int>({0, 1, 2, 3, 4, 5, 6}), - ext::vector<unsigned int>({0, 0, 1, 2, 3, 4, 5}), - ext::vector<unsigned int>({0, 1, 0, 1, 2, 3, 4}), - ext::vector<unsigned int>({0, 1, 1, 1, 2, 2, 3}), - ext::vector<unsigned int>({0, 0, 1, 2, 2, 3, 2}), - ext::vector<unsigned int>({0, 1, 1, 1, 2, 3, 4}), - ext::vector<unsigned int>({0, 1, 2, 2, 2, 2, 3}), - ext::vector<unsigned int>({0, 0, 1, 2, 3, 3, 2}), - ext::vector<unsigned int>({0, 0, 1, 2, 3, 4, 3}), - ext::vector<unsigned int>({0, 1, 1, 1, 2, 3, 4}), - ext::vector<unsigned int>({0, 0, 1, 2, 2, 3, 3}), - ext::vector<unsigned int>({0, 1, 0, 1, 2, 3, 4}), - ext::vector<unsigned int>({0, 1, 1, 0, 1, 2, 3}), - ext::vector<unsigned int>({0, 1, 2, 1, 0, 1, 2}), - ext::vector<unsigned int>({0, 1, 2, 2, 1, 0, 1}), - ext::vector<unsigned int>({0, 0, 1, 2, 2, 1, 0}), - + ext::vector<unsigned int>({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}), + ext::vector<unsigned int>({1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0}), + ext::vector<unsigned int>({2, 1, 0, 1, 1, 1, 2, 1, 1, 1, 1, 0, 1, 2, 2, 1}), + ext::vector<unsigned int>({3, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1, 0, 1, 2, 2}), + ext::vector<unsigned int>({4, 3, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 1, 0, 1, 2}), + ext::vector<unsigned int>({5, 4, 3, 2, 3, 3, 2, 3, 4, 3, 3, 3, 2, 1, 0, 1}), + ext::vector<unsigned int>({6, 5, 4, 3, 2, 4, 3, 2, 3, 4, 3, 4, 3, 2, 1, 0}), }; CPPUNIT_ASSERT(expected_result == stringology::simulations::LevenshteinDynamicProgramming::compute_table(text, pattern));