【问题标题】:Memory/CPU optimzation?内存/CPU优化?
【发布时间】:2017-05-04 02:01:37
【问题描述】:

我的程序使用了大量的内存和处理能力,我最多只能搜索 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();

}

【问题讨论】:

  • 这是什么编程语言?是Java吗?请用使用的语言标记您的问题。要更新您的问题,请点击帖子下方的 "edit" 链接。谢谢。

标签: memory cpu primes


【解决方案1】:

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

要存储多达 6,000 个素数,您只需要大约 3,000 位,即小于 380 字节。您的基本解决方案是埃拉托色尼筛法,并且 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

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 2011-03-30
    • 2013-09-27
    相关资源
    最近更新 更多