Реализация:
Асимптотика: O(M+N), M x N
Реализация:
Асимптотика: O(Mlog(N)), M x N
Реализация:
Асимптотика: ~O(Mlog(N)), M x N
Реализация:
Реализация:
Замеры производились с помощью Java Microbenchmark Harness: https://github.com/openjdk/jmh
matrix-search-benchmark/sample_results.txt
Lines 1 to 79 in fe2b4cc
- Во всех тестовых случаях линейный алгоритм, ожидаемо, работает быстрее, за исключением лишь тестов матриц
2x8192, ..., 1024x8192
, сгенерированных BetaGenerator (matrix[i][j] = (N/M * i * j) * 2
)- Почему быстрее в большинстве случаев: у него минимальная константа и сама асимптотика в
log
раз меньше - Почему медленнее на вышеуказанных Beta матрицах: так как
target = const = 16*N + 1 = 16 * 8192 + 1 = 131073
и числа, близкие к нему, находятся практически в начале второй строчки уже в матрице2x8192
, не говоря уже и о больших. Бинарный и экспоненциальный поиски быстрее приходят к началу, а линейный ещё должен успеть обойти~8000
элементов, чтобы только дойти до начала второй строки
- Почему быстрее в большинстве случаев: у него минимальная константа и сама асимптотика в
- На Alpha матрицах бинарный и экспоненциальный идут рука об руку вплоть до матрицы
4096x8192
, на которой ситуация резко меняется. Бинарный начинает работать сильно хуже, чем экспоненциальный.- Почему так: всё просто - экспоненциальный растёт с этого момента уже только за счёт линейного спуска вниз, т.е. сам экспоненциальный
поиск закончился, дальше все идёт линейно вниз (либо вырождается в бинарный на малых масштабах, см. реализацию экспоненциального+бинарного).
А вот бинарный начинает буксовать, потому что постоянно двигается влево на 1, но тратя на это
log(префикс текущей строки)
операций, а спускается всё так же, как это делает эксп+бин
- Почему так: всё просто - экспоненциальный растёт с этого момента уже только за счёт линейного спуска вниз, т.е. сам экспоненциальный
поиск закончился, дальше все идёт линейно вниз (либо вырождается в бинарный на малых масштабах, см. реализацию экспоненциального+бинарного).
А вот бинарный начинает буксовать, потому что постоянно двигается влево на 1, но тратя на это