From f841f3e3ec97aacb478d86132e7daa59a02bb1dd Mon Sep 17 00:00:00 2001 From: Tomas Capek <tomas@capek.io> Date: Thu, 3 May 2018 16:25:19 +0200 Subject: [PATCH] Rework simulation of Levenshtein searching automaton. --- .../LevenshteinDynamicProgramming.h | 19 ++++++++++++++++--- .../LevenshteinDynamicProgrammingTest.cpp | 8 ++++++++ .../LevenshteinDynamicProgrammingTest.h | 2 ++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h index 54a881e4c1..6584d91ce4 100644 --- a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h +++ b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h @@ -22,6 +22,8 @@ public: template <class SymbolType> static ext::vector<ext::vector<unsigned int>> compute_table(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern); + template <class SymbolType> + static ext::set<unsigned int> search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors); }; #include <iostream> @@ -59,11 +61,22 @@ ext::vector<ext::vector<unsigned int>> LevenshteinDynamicProgramming::compute_ta } } - for(const auto & row : table) { - std::cout << row << std::endl; + return table; +} + +template <class SymbolType> +ext::set<unsigned int> LevenshteinDynamicProgramming::search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors) { + auto table = LevenshteinDynamicProgramming::compute_table(text, pattern); + + ext::set<unsigned int> result; + + for(unsigned int i = 0; i<= text.getContent().size(); i++) { + if(table[pattern.getContent().size()][i] <= errors) { + result.insert(i-1); + } } - return table; + return result; } diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp index a87f8f14cc..378a4b41e0 100644 --- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp +++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp @@ -23,6 +23,14 @@ void LevenshteinDynamicProgrammingTest::testTableConstruction() { CPPUNIT_ASSERT(expected_result == stringology::simulations::LevenshteinDynamicProgramming::compute_table(text, pattern)); } +void LevenshteinDynamicProgrammingTest::testSearch() { + auto text = string::LinearString<>("adcabcaabadbbca"); + auto pattern = string::LinearString<>("adbbca"); + + ext::set<unsigned int> expected_result = {2, 3, 5, 6, 7, 9, 11, 12, 13, 14}; + auto result = stringology::simulations::LevenshteinDynamicProgramming::search(text, pattern, 3); + CPPUNIT_ASSERT(expected_result == result); +} void LevenshteinDynamicProgrammingTest::setUp() { } diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h index 6dade7594b..2658bbafa6 100644 --- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h +++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h @@ -6,6 +6,7 @@ class LevenshteinDynamicProgrammingTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(LevenshteinDynamicProgrammingTest); CPPUNIT_TEST(testTableConstruction); + CPPUNIT_TEST(testSearch); CPPUNIT_TEST_SUITE_END(); public: @@ -13,5 +14,6 @@ public: void tearDown ( ); void testTableConstruction(); + void testSearch(); }; #endif // LEVENSHTEIN_DYNAMIC_PROGRAMMING_TEST_H_ -- GitLab