levenshtein.hpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #pragma once
  2. #include <utility>
  3. #include <queue>
  4. unsigned int levenshtein_get(unsigned int * const *map, int px, int py)
  5. {
  6. if (px == -1 && py == -1)
  7. return 0;
  8. if (px == -1)
  9. return py +1;
  10. if (py == -1)
  11. return px +1;
  12. return map[px][py];
  13. }
  14. template <class T, typename SIZE=unsigned int>
  15. unsigned int levenshtein(const T *a, const T *b, const SIZE aSize, const SIZE bSize)
  16. {
  17. unsigned int **items = new unsigned int*[aSize]();
  18. for (SIZE i =0; i < aSize; i++)
  19. {
  20. items[i] = new unsigned int[bSize]();
  21. for (SIZE j =0; j < bSize; j++)
  22. {
  23. unsigned int add = levenshtein_get(items, i, j -1) +1;
  24. unsigned int del = levenshtein_get(items, i -1, j) +1;
  25. unsigned int mod = levenshtein_get(items, i -1, j -1) +(a[i] == b[j] ? 0 : 1);
  26. items[i][j] = std::min(std::min(add, del), mod);
  27. }
  28. }
  29. const unsigned int levenshtein = items[aSize -1][bSize -1];
  30. for (SIZE i =0; i < aSize; i++)
  31. delete[] items[i];
  32. delete[] items;
  33. return levenshtein;
  34. }
  35. template <class T, typename SIZE=unsigned int>
  36. unsigned int levenshtein(const T &a, const T &b, const SIZE aSize, const SIZE bSize)
  37. {
  38. unsigned int **items = new unsigned int*[aSize]();
  39. for (SIZE i =0; i < aSize; i++)
  40. {
  41. items[i] = new unsigned int[bSize]();
  42. for (SIZE j =0; j < bSize; j++)
  43. {
  44. unsigned int add = levenshtein_get(items, i, j -1) +1;
  45. unsigned int del = levenshtein_get(items, i -1, j) +1;
  46. unsigned int mod = levenshtein_get(items, i -1, j -1) +(a[i] == b[j] ? 0 : 1);
  47. items[i][j] = std::min(std::min(add, del), mod);
  48. }
  49. }
  50. const unsigned int levenshtein = items[aSize -1][bSize -1];
  51. for (SIZE i =0; i < aSize; i++)
  52. delete[] items[i];
  53. delete[] items;
  54. return levenshtein;
  55. }