Java 在数组中存储素数最有效的方法是什么

Java 在数组中存储素数最有效的方法是什么,java,algorithm,Java,Algorithm,我想用一种有效的算法将素数存储在一个n=100000的数组中。我使用基本方法来存储素数,但这需要更多的时间 void primeArray(){ int primes[100000],flag=0,k=2; primes[0]=2; primes[1]=3; for(int i=5;i<n;i=i+2){ for(int j=2;j<i/2;j++){

我想用一种有效的算法将素数存储在一个n=100000的数组中。我使用基本方法来存储素数,但这需要更多的时间

       void primeArray(){
        int primes[100000],flag=0,k=2; 
        primes[0]=2;
        primes[1]=3;
        for(int i=5;i<n;i=i+2){
                for(int j=2;j<i/2;j++){
                    if(i%j==0){
                    flag=1;
                    break;
                   }
                }

            if(flag==0){
                primes[k]=i;
                k++;
            }

            flag=0;
       }   
     }
void primerarray(){
整数素数[100000],标志=0,k=2;
素数[0]=2;
素数[1]=3;
对于(int i=5;i使用类似或偶数的集合。由于主数必须是唯一的,所以Set应该是明显的选择


例如:
Set Set=newhashset();
2和3也是素数:您希望包含它们


通过使第二个循环在
j*j时迭代,您可以将算法的复杂性从
O(n^2)
提高到
O(n^3/2})
,我假设您已经知道如何计算素数,并且正在寻找一种紧凑的方法来存储它们

如果“最有效”的意思是“压缩到尽可能小的空间”,那么有一种方法可以在一个位数组中存储素数,其位数大约是在一个位数组中存储真/假标志位数的一半

诀窍在于,除2、3和5外,所有素数的形式都是30x加1、7、11、13、17、19、23或29。因此,您可以将1到30的素数存储在一个字节中(忽略2、3、5),然后将31到60的素数存储在一个字节中,然后将61到90的素数存储在一个字节中,依此类推。您必须分别处理2、3和5

让我们以67为例,使用整数除法计算67/30=2,因此你将看到素数指示字节数组的索引2的字节。然后67 - 30×2=7,这是字节的第二位,所以你看那里,找到1,并得出67是素数。< /P>


使用这种方法,您可以在33334字节中存储少于一百万的素数。有关更多信息,请参阅。

数组中的每个整数都有32位

所以你可以跟着这个

if(isPrime(n))
a[n/32]=a[n/32]|(1<<(n%32));
if(isPrime(n))

a[n/32]=a[n/32]|(1100000以下有
9592
素数。100000以下的所有数字都可以用
17位表示(因为2^17是131072)。此外,除素数
2
外,所有素数都是奇数,因此在最后一位将有一个0-因此,我们可以在
16位
2字节
中表示100000以下的每个素数。因此,用9591个奇数素数和关于素数
2
的特殊规则创建一个双字节数组。这将给出
19182字节数据。

这是关于数字存储?还是关于寻找素数?你有没有尝试过谷歌搜索“素数算法”或类似的东西?“埃拉托斯特尼筛”@Mike它将素数存储在一个数组中素数[]。
(intj=2;jpinite数字本身是有序的,这表明set可能不是正确的…
O(n*logn)
关于埃拉托什尼筛。@DanielFischer:我被纠正了。谢谢!这些提示非常有趣!序列6-4-2-4-2-4-6-2可以使搜索下一个候选素数的速度比在奇数上搜索2乘2快得多!以及一个字节方法中的八个素数使表示非常紧凑。我做到了这一点通过将这些字节放入Java位集中,我可以进行一些实验。谢谢!
if(isPrime(n))
a[n/32]=a[n/32]|(1<<(n%32));