Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 优化Eratosthenes筛,在Bool阵列中添加轮子_Arrays_Algorithm_Optimization_Primes_Sieve Of Eratosthenes - Fatal编程技术网

Arrays 优化Eratosthenes筛,在Bool阵列中添加轮子

Arrays 优化Eratosthenes筛,在Bool阵列中添加轮子,arrays,algorithm,optimization,primes,sieve-of-eratosthenes,Arrays,Algorithm,Optimization,Primes,Sieve Of Eratosthenes,我知道有一些帖子是关于如何实现轮子的,但我真的很难看到如何用我目前的方法实现轮子 我用C创建了自己的位数组,实现如下: #define setBit1(Array,i)(Array[i/INT_BITS]|=(1由于位操作开销,它将始终较慢 但你可以尝试优化它 setBit1(Array,i)可以通过使用所有预移位位的常量数组(我称之为ONE_位)来改进 新增: #定义setBit1(数组,i)(数组[i/INT_位]|=一位[i%INT_位]) setBit0(数组,i) 新增: #定义set

我知道有一些帖子是关于如何实现轮子的,但我真的很难看到如何用我目前的方法实现轮子

我用C创建了自己的位数组,实现如下:


#define setBit1(Array,i)(Array[i/INT_BITS]|=(1由于位操作开销,它将始终较慢

但你可以尝试优化它

setBit1(Array,i)
可以通过使用所有预移位位的常量数组(我称之为
ONE_位
)来改进

新增:
#定义setBit1(数组,i)(数组[i/INT_位]|=一位[i%INT_位])

setBit0(数组,i)

新增:
#定义setBit0(数组,i)(数组[i/INT_位]&=ALL_,但只有一位[i%INT_位])

此外,整数位很可能是2的幂,因此可以替换
i%INT\u位

通过
i&(INT\u BITS-1)
//当然,您应该将
INT\u BITS-1
存储在一个常量中并使用它


如果mutch可以加快代码的速度,以及如何加快代码的速度,则必须通过分析每次更改来检查。

当我修复您的实现并在我的Macbook Pro上运行它时,需要17秒来标记所有组合4]|=((uint8_t)1)1和7)) int main(int argc,char*argv[]) { //我们将找到所有素数(MAXTEST) { //无法在不超过阵列大小的情况下增加此因子 继续; } //耶!-我们可以在这里增加到下一个复合产品 curprod=(uint32_t)testprod; 产品[stksize++]=curprod; SETBIT(mem、curprod);
while(curprod抱歉地问,wheels是什么?Tomas Oliveira y Silva(我可能拼写错了)编写了可用的最快筛,并在中进行了描述。您需要在malloc()之后用零填充该数组数组在malloc隐式后初始化为零。逐个打印所有位证实了这一点。这是意外的吗…?我使用的是GCC C99。编译器不会优化模运算符以实现这一点吗?我接受了您关于创建常量数组的建议,我很高兴地说,它稍微提高了速度对于1000万个素数,时钟时间缩短了9.7%。但是对于100万个素数,这并不是更快。分别为100万个素数和100万个素数收集30个和150个数据点,然后取平均值。我觉得这有点太严肃了。@Good Rice:取决于编译器。还需要设置INT_位常量,否则编译器无法对其进行优化。此外,对%的优化仅对无符号值有效。如我所述,请尝试并分析结果,以检查是否有任何改进。“Atkin…非常实用”您是根据个人经验说的吗?我在链接的WP文章中搜索了“实用”一词它似乎在说完全相反的话,有着强烈的信念和非常详细的论证。:)我也怀疑“Euler’s sieve…需要一个int数组而不是位数组”。@WillNess所说的“实用”,我的意思是实现不必非常复杂(尽管你可以做很多复杂的优化),您可以使用位掩码作为筛选,它是线性时间,并且支持分段。W.r.t.Euler的筛选,为了实现线性时间,您必须能够在恒定时间内从列表中划掉组合,并在线性时间内迭代剩余的组合。需要一个比位掩码更大的数据结构。需要一个int数组最紧凑的“简单”我所知道的基础。对于Euler筛,我们只需要达到最高极限sqrt的素数。因此筛本身可以是位数组,并且额外的sqrt大小的int数组将产生最小的影响。至于支持分段,我不这么认为。我们需要上一步的全部条件,用于下一步。我很乐意在这里证明是错误的。至于阿特金斯,它确实看起来非常复杂,而且有一些说法,似乎是有根据的,即使在那时它也输给了2,3,5,…11(或…17)啊,我想我确实是在比特数组中出错了。所有的coprim都是int,如果在比特数组中保留为非归零的条目,访问它们会引入额外的复杂性因素,是的。(另外,我们必须使用重复乘法,这也不利于速度).分割问题仍然存在。我对支持分割的评论是针对Atkin的筛。你是对的,优化可以使SoE更快。当你开始交易优化时,你可以来回移动,我认为现在最快的实际实现是Eratosthenes筛:O(N)和O之间的区别(N log N)不足以主导优化