Я пытался решить проблему кодирования в C++, которая считает число простых чисел меньше неотрицательного числа n
.
Итак, я сначала придумал некоторый код:
int countPrimes(int n) {
vector<bool> flag(n+1,1);
for(int i =2;i<n;i++)
{
if(flag[i]==1)
for(long j=i;i*j<n;j++)
flag[i*j]=0;
}
int result=0;
for(int i =2;i<n;i++)
result+=flag[i];
return result;
}
который занимает 88 мс и использует 8,6 МБ памяти. Затем я изменил свой код на:
int countPrimes(int n) {
// vector<bool> flag(n+1,1);
bool flag[n+1] ;
fill(flag,flag+n+1,true);
for(int i =2;i<n;i++)
{
if(flag[i]==1)
for(long j=i;i*j<n;j++)
flag[i*j]=0;
}
int result=0;
for(int i =2;i<n;i++)
result+=flag[i];
return result;
}
что занимает 28 мс и 9,9 МБ. Я не очень понимаю, почему существует такой разрыв в производительности как во время выполнения и потребление памяти. Я прочитал относительные вопросы, подобные этому и тому, но я все еще в замешательстве.
РЕДАКТИРОВАТЬ: я сократил время работы до 40 мс с 11,5 МБ памяти после замены vector<bool>
на vector<char>
.