Этого алгоритма поиска всех простых чисел ниже NКак вычислить T (N) для этого алгоритма простых чисел FINDER
var f = function(n){
var primes = [2]; //1
var flag; //1
for(var i=3; i<n; i+=2){ // (from 3 to n-1)/2
flag = true; //1
var startI = 0; // 1
for(var y=primes[startI]; y<=Math.sqrt(i); y=primes[++startI]){ // ???
if(i%y === 0) // 1
flag = false; // 1
}
if(flag) // 1
primes.push(i); // 1
}
return primes; // 1
}
До сих пор мой анализ делается до первого цикла, я не знаю, как обращаться вторая сумма (та, которая использует primes.length
и Math.sqrt
).
Т (п) = 1 + 1 + сумма ((1+ 1+ ?? странно сумма ???), от я = 3 до п -1)/2 + 1 + 1
Я понимаю, как анализировать до второго вложенного цикла, я подозреваю, что вокруг журнала (N) или что-то подобное, но я хотел бы знать точное количество итераций ..
Вопросы:
- Как я могу обработать такой цикл, который использует массивы в памяти для i terate?
- Если невозможно получить точный номер, как я могу получить хорошее приближение?
Любая помощь приветствуется (ссылки на похожие случаи, книги и т. Д.).
Очевидно, что сумма ограничена сверху n * sqrt (n)/ln (n) (ее наибольший член) и равна O (n^{3/2}/ln n). Ограничив сумму на диапазон n/a <= i <= n для некоторого фиксированного a> 1, вы получите, что T (n) является Omega (n^{3/2}/ln n). Итак, вы получите плотную асимптотику для T (n) – vib
Спасибо, я добавлю это к моему ответу. Проблема, которую я испытываю со сложностями типа «O (n^{3/2}/ln n)», заключается в том, что ее трудно сравнивать с другими, поскольку вы что-то делите. Я пытался избежать этого. – AbcAeffchen
Спасибо. Я не понимаю, почему вы сделали T (n-2) + sqrt (n) /0.5*ln (n), можете ли вы подробнее рассказать об этом? – rahpuser