【发布时间】:2019-08-17 02:02:08
【问题描述】:
我正在一个类似 leetcode 的平台上编码。有一个任务:计算低于给定界限的素数。
我使用了算法:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
我从这里复制代码:https://www.geeksforgeeks.org/sieve-of-eratosthenes/,除了我让false 代表isPrime 以避免使用memset。这是我的代码:
void SieveOfEratosthenes(int n)
{
bool *prime = new bool[n+1](); // initialized by false by default
for (int p=2; p*p<=n; p++)
{
if (prime[p] == false)
{
for (int i=p*p; i<=n; i += p)
prime[i] = true;
}
}
for (int p=2; p<=n; p++)
if (prime[p])
cout << p << " ";
}
但是,当我执行它时,平台告诉我在100 000 000作为输入的情况下我使用了太多的内存。
我检查了sizeof(bool) 等于1。
有什么方法可以减少这段代码的内存消耗吗?
【问题讨论】:
-
@JamesKPolk 好吧,我想我在那篇文章中已经使用了所有方法。
-
std::vector<bool>每个元素使用 1 个 bit,因此使用 bool 数组的 1/8 存储空间。 -
您应该尝试实施 Eratosthenes 的分段筛吗?它的主要目标是减少内存使用。
-
@JosephWood ... 从而大大加快了速度,让内存适合缓存。 :)
标签: c++ memory profiling primes