Pull to refresh
0
0
Send message
Есть способ оценить сложность алгоритма-черного-ящика экспериментально:
Пусть время выполнения алгоритма — это f(n). Если это полиномиальное время, т.е. f(n) =a*n^b, в этом случае a и b можно найти следующим путем:
* запускаем алгоритм на 1000*n входных данных. Засекаем время.
* запускаем алгоритм на 2000*n входных данных. Засекаем время.
* запускаем алгоритм на 4000*n входных данных. Засекаем время.
* запускаем алгоритм на 8000*n входных данных. Засекаем время.
* запускаем алгоритм на 16000*n входных данных. Засекаем время.

В случае судоку можно взять меньшие размеры взодных данных: 1n, 2n, 4n, 8n, etc…

Затем строим таблицу:
_n_|__время выполнения__|__rate________|__b=log(rate)__|
1 * n| t1 = a * 1^b * n^b | |
2 * n| t2 = a * 2^b * n^b | t2/t1 = t2' = 2^b | log(t2') |
4 * n| t3 = a * 4^b * n^b | t3/t2 = t3' = 2^b | log(t3') |
8 * n|… |… |… |

По идее все строчки последнего столбика — это одно и то же число b. Но из-за погрешностей значение b будет стабилизироваться лишь со временем при больших объемах входных данных.
Если же b не стабилизировалось, но медленно растет, вероятно f(n)= a*n^b*log(n).
Не стабилизировалось и быстро расте, вероятно f(n) степенная функция или «факториальная».

Information

Rating
Does not participate
Registered
Activity