Как узнать приблизительную сложность алгоритма, зная время его выполнения?
Модульная разность отношений Y к известному перечню сложностей {n,n^2,nlogn,n!,...}.
Ближайшая дробь, стремящаяся к единице, И одна из их взаимных разностей (расстояний) - стремящихся к нулю, и будет искомое значение.
Абстрагируясь от алгоритмов и их сложности в Big-O-нотации, задача сводится к подсчёту различий значений данной функции и функций-кандидатов на каком-то множестве контрольных точек.

Взять какой-то набор значений [x0, x1, ... xN].
Получить «правильные» y_true = [f(x0), f(x1), ... f(xN)]
Для каждой функции-кандидата из этих же x получить их «предсказания» y_pred = [Fn(x0), Fn(x1), ... Fn(xN)]

Определить, какая из функций меньше всего «ошиблась». Для этого сложить квадраты разниц y_true - y_pred выданных каждой из функций на наборе входных значений x

Наименьшая сумма укажет наиболее вероятного кандидата.

Например, 
x = [1, 2, 4, 8, 16, 32, 64]
f(x) = [y0, y1, y2, y3, y4, y5, y6]

// n
[1, 2, 4, 8, 16, 32, 64]
sum = (y0 - 1)^2 + (y1 - 2)^2 + (y2 - 4)^2 + ... + (y6 - 64)^2 = sum0

// n^2
[1, 4, 16, 64, 256, 1024, 4096]
sum =  (y0 - 1)^2 + (y1 - 4)^2 + (y2 - 16)^2 + ... + (y6 - 4096)^2 = sum1

// так же посчитать суммы ошибок для остальных функций:
// n * log(n),  n!

минимальное значение среди sumN укажет функцию, наиболее близкую к искомой.