После просмотра некоторых видеороликов Terence Tao я хотел попробовать внедрить алгоритмы в код C++, чтобы найти все простые числа до числа n. В моей первой версии, где у меня было всего целых чисел от 2 до n, чтобы проверить, были ли они делятся на что-либо от 2 до sqrt (n), я получил программу, чтобы найти простые числа от 1 до 10 000 000 за ~ 52 секунды.C++ Оптимизация этого алгоритма
Попытка оптимизировать программу и реализовать то, что я теперь знаю, как сито Эратосфена, я предположил, что задача будет выполняться намного быстрее, чем 51 секунда, но, к сожалению, это было не так. Даже идти до 1000000. потребовалось значительное количество времени (не время это, хотя)
#include <iostream>
#include <vector>
using namespace std;
void main()
{
vector<int> tosieve = {};
for (int i = 2; i < 1000001; i++)
{
tosieve.push_back(i);
}
for (int j = 0; j < tosieve.size(); j++)
{
for (int k = j + 1; k < tosieve.size(); k++)
{
if (tosieve[k] % tosieve[j] == 0)
{
tosieve.erase(tosieve.begin() + k);
}
}
}
//for (int f = 0; f < tosieve.size(); f++)
//{
// cout << (tosieve[f]) << endl;
//}
cout << (tosieve.size()) << endl;
system("pause");
}
ли повторное реферирование векторов или что-то? Почему это так медленно? Даже если я полностью упускаю из виду что-то (может быть, полный новичок в этом: я), я думаю, что поиск простых чисел от 2 до 1 000 000 с помощью этого ужасного неэффективного метода будет быстрее, чем мой первоначальный способ найти их от 2 до 10 000 000.
Надеюсь, у кого-то есть четкий ответ на этот вопрос - надеюсь, я смогу использовать любое знание, которое будет почерпнуто в будущем при оптимизации программ, использующих много рекурсии.
исправьте углубление. – cdonat
Стирание элементов из любого другого места, кроме конца вектора, медленное, да. – emlai
Сито Эратосфена не проверяет делимость, оно использует только добавление. (Вам не нужно знать какую-либо арифметику для выполнения сита вручную.) – molbdnilo