【发布时间】:2015-04-16 05:32:56
【问题描述】:
我想知道是否有人对我可以做些什么来提高代码的运行速度有任何建议。我写了一个Sieve of Atkin 函数,它返回一个向量,包括来自[2, max] 的所有素数。
这是我的代码。
void atkin_sieve (unsigned int max, std::vector <unsigned int> & primes) {
// Sieve array up to max defaulted to false
// Index's [0, max] correspond to numbers
// Dynamic memory so all values default false
bool* sieve = new bool [max + 1];
// Square root of max number
unsigned int sqrt_max = int (sqrt (max));
// Unsigned integers declared to save time
unsigned int n, x, y;
// TODO - Explain this
for (x = 1; x < sqrt_max; x++) {
for (y = 1; y < sqrt_max; y++) {
n = (4 * x * x) + (y * y);
if (n <= max && (n % 12 == 1 || n % 12 == 5))
sieve [n] = !sieve [n];
n = (3 * x * x) + (y * y);
if (n <= max && (n % 12 == 7))
sieve [n] = !sieve [n];
n = (3 * x * x) - (y * y);
if (x > y && n <= max && (n % 12 == 11))
sieve [n] = !sieve [n];
}
}
// TODO - Explain this
for (x = 5; x < sqrt_max; x++) {
if (sieve [x]) {
n = x * x;
for (y = n; y <= max; y += n)
sieve [y] = false;
}
}
// Push primes 2, 3, and 5
primes.push_back(2);
primes.push_back(3);
primes.push_back(5);
// Start from prime 7, skip even numbers
for (x = 7; x <= max; x += 2) {
// If the number is prime
if (sieve [x])
// Push it into the vector
primes.push_back(x);
}
// Delete the sieve array
delete [] sieve;
}
我有几个问题想知道我可以做些什么来优化这个功能。
我将筛子数组初始化为布尔值的动态数组,以便它们都默认为 false,让筛子像这样动态是更快还是应该将其保留为普通数组?
在算法处理完毕后,我使用 for 循环将素数存储在向量中,有没有更快的方法可以找到筛子中的所有素数以将它们存储在向量中?
欢迎提供任何其他提示、技巧、提示或代码,非常感谢,谢谢。
【问题讨论】:
-
这不应该是在代码审查中吗?
-
bool* sieve = new bool [max + 1];自找麻烦,改用std::unique_ptr<bool[]> sieve(new bool [max + 1]);
标签: c++ optimization sieve-of-atkin