Вариант с длиной в uint8 применим только если коротка строка короче 128 символов - иначе будет переполнение. Железо Intel(R) Core(TM) i7-2600K CPU @ 3.80GHz время при желании можно пересчитать из тактов.
Ключи сборки gcc -O3 -mavx -msse4 test.cpp -o test && ./test , если применить avx2/avx512 можно наверно ещё 2-4 раза ускорить (-mavx погоды особой не делает - у него для целых нужных команд нет).
Оптимизированный код (короткая строка должна быть короче 32К символов):
Си-код тормозит почти в 10 раз - можно ведь считать параллельно (по диагонали):
levenshtein sse_variant len103535 113 12863 113 125 uint16
440665 221 41669 221 250
1670380 445 151093 445 500
6740058 896 967752 896 1000
28449713 1769 2670073 1769 2000 7.5 vs 0.7ms
112313687 3517 9621706 3517 4000 29.5 vs 2.5ms
417518031 7034 40077041 7034 8000
1709693702 14038 166281964 14038 16000
6812783553 28117 730058352 28117 32000 uint16
... ... ... ... ... ... ...
103583 113 7589 149 125 uint8
Вариант с длиной в uint8 применим только если коротка строка короче 128 символов - иначе будет переполнение. Железо Intel(R) Core(TM) i7-2600K CPU @ 3.80GHz время при желании можно пересчитать из тактов.
Ключи сборки gcc -O3 -mavx -msse4 test.cpp -o test && ./test , если применить avx2/avx512 можно наверно ещё 2-4 раза ускорить (-mavx погоды особой не делает - у него для целых нужных команд нет).
Оптимизированный код (короткая строка должна быть короче 32К символов):