内存/ CPU优化?

时间:2017-05-04 02:01:37

标签: memory cpu primes

我的程序使用了大量的内存和处理能力,我最多只能搜索到6000,有没有办法减少这个使用的内存量?这将有助于未来的编程工作,因为知道如何巧妙地使用内存将会很有用。

    ArrayList<Integer> factor = new ArrayList<Integer>();
    ArrayList<Integer> non = new ArrayList<Integer>();
    ArrayList<Integer> prime = new ArrayList<Integer>();

    Scanner sc = new Scanner(System.in);
    System.out.println("Please enter how high we want to search");
    long startTime = System.nanoTime();
    int max = sc.nextInt();
    int number = 2; 

while (number < max)
{

        for (int i=0;i<prime.size();i++)
    {
            int value = prime.get(i);
            if (number % value == 0)
        {
            factor.add(value);
        }
        else
        {
            non.add(value);
        }
    }

    if(factor.isEmpty())
    {   
        prime.add(number);
    }
    else
    {   
        composite.add(number);          
    }
    factor.clear(); 
    number++;


}   
    int howMany=prime.size();
    System.out.printf("The are "+howMany+" prime numbers up to " +max + " and they are: "  +prime );
    System.out.println();

}

1 个答案:

答案 0 :(得分:0)

你没有说你正在使用什么语言,所以这个答案是通用的。

要存储高达6,000的素数,您只需要大约3,000位,小于380字节。你的基本解决方案是Eratosthenes的Sieve以及2是唯一的偶数素数。您设置筛子只处理奇数,这将所需的存储量减半。由于筛网仅为每个奇数保存素数或非素数,因此每个数字的存储量可减少到一位。

一旦你设置了筛子,有很多站点,包括这个站点有不同语言的说明,你只需要从筛子中检索你的范围内的数字的素数/非素值。假设已经设置了筛子,这是用于检查数字是否为素数的伪代码:

boolean function isPrime(number)

  // Low numbers
  if (number < 2)
    return false
  endif

  // Even numbers
  if (number is even)
    return number == 2
  endif

  // Odd numbers >= 3
  return sieve[(number - 1) / 2] == 1

end function

低数字不是素数。 2是唯一的素数;所有其他偶数都不是素数。奇数2n + 1的主标志存储在筛子的第n位。这假定您使用的语言允许位级访问,类似于Java中的BitSet