Java 在数组中存储素数最有效的方法是什么
我想用一种有效的算法将素数存储在一个n=100000的数组中。我使用基本方法来存储素数,但这需要更多的时间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++){
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));