Гадкие числа также известны как обычные числа . Как вы можете видеть из статьи в Википедии , известно, что число обычных чисел до m
равно
(ln(m*sqrt(30))^3 / (6*ln(2)*ln(3)*ln(5)) + O(ln(m))
Другими словами, ваш getNthUglyNo
позвонит isUgly
чтобы получить n
-ое регулярное число
~ 1/sqrt(30) * exp((n*6*ln(2)*ln(3)*ln(5))^(1/3))
раз.
Вероятность того, что равномерное случайное целое число x
между 0
и M
делится 2^y
асимптотически 1/2^y
, поэтому среднее число повторений l oop в вызове maxDivide(no, 2);
составляет O(1)
и эквивалентно для maxDivide(no, 3);
и maxDivide(no, 5);
.
Следовательно, ваш алгоритм равен
Theta( exp((n*6*ln(2)*ln(3)*ln(5))^(1/3)) )
, что приблизительно равно
Theta( exp(1.9446 * n^(1/3)) )
Также обратите внимание, что подключение n = 500
к асимптотике c числа итераций, упомянутых выше, дает вам 921498
, что довольно близко к числу итераций @sowrov, найденных в их ответе (937500
).