使用List而不是Array来更高效地生成Prime数字?

时间:2014-12-29 12:52:14

标签: java list primes sieve-of-eratosthenes

基于其中一个示例,下面是给定截止值的素数生成器。

我的问题是在某些实现中,一个数组用于标记所有数字,这些数字是多个,直到只剩下素数。下面的方式类似但在下面的例子中我们不需要维护数组中的所有数字并检查在黄金测试期间是否与其下方的元素交叉,并且在该分部中仅使用未交叉的元素。

以下更好的地方我们只是在列表中维护素数并减少比较次数?

class PrimesBySieve
{
    public static void main(String args[]){
        generateTo(20);
    }

    public static void generateTo(int cutoff) 
    {
        try {
            ArrayList<Integer> primes = new ArrayList<Integer>();
            primes.add(2);


            int j;
            boolean isPrime;
            for(int i=3;i<=cutoff;i++){

                //Check if i is Prime by dividing with all the primes in the list which       
                //are smaller than i
                //Any number can be expressed as a product of primes
                j=0;
                isPrime=true;
                while(primes.get(j)*primes.get(j)<=i && j<=primes.size()){
                    if(i%primes.get(j)==0){
                        isPrime=false;
                    }
                    j++;
                }

                //Add the prime to the output.
                if(isPrime){
                    primes.add(i);
                }
            }   
            System.out.println(primes);
        }
        catch(Exception e){
            System.out.println(e.getMessage());
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您的算法效率不高。因此,无论您使用哪种数据结构 你将无法获得出色的性能提升。你应该使用另一种算法
被称为'Eratosthenes的筛子'。尝试实现这个算法,你会注意到 性能差异(特别是对于较大的N值)。目前你是 N = 20。

Sieve of Eratosthenes