У меня следующая проблема:
Учитывая, что четные числа больше 4 могут быть получены путем сложения 2 простых
числа, я должен написать алгоритм, который проверяет это. Алгоритм должен занимать меньше времени, чем O (n ^ 2).
Например, есть набор чисел от 6 до n. Если у нас есть число 6, ответ будет 6 = 3 + 3, а для 22 = 17 + 5 и т. Д.
Моя первая идея:
S - set of n numbers
for i=1 to n {
//removing odd numbers
if (S[i]%2!=0)
continue;
result = false;
for j=2 to S[i]-2{
if (j.isPrime) // prime test can be done in O(log^2(n))
if ((S[i]-j).isPrime)
result = true;
break;
else
continue;
}
if (result == false)
break;
}
Поскольку я использую 2 цикла for, общее время выполнения этого алгоритма должно быть
O(n*n)*O(log^2(n)) = O(n^2*log^2(n))
, что не менее O(n^2)
.
У кого-нибудь есть идея сократить время работы, чтобы получить требуемое время меньше O(n^2)
?