当前位置: 首页 > 知识库问答 >
问题:

改进筛法的性能

韦阳辉
2023-03-14

我正在编写一种方法来查找高达n的素数(埃拉托色尼筛),是的,这是为了家庭作业。我希望在我编写的方法中提高性能。在过去的几天里,我一直在调整这个,但无法遵循给定的伪代码并提高性能。

伪代码如下:
创建一个数字队列来处理
用包含2到n的整数填充队列
创建一个空的结果队列来存储素数
重复以下步骤:
通过从数字队列中删除第一个值来获取下一个素数p
将p放入素数的结果队列
循环通过数字队列消除所有可被p整除的数字
同时(p小于n的平方根)
所有剩余值都是素数,因此将它们转移到素数结果队列

这是我目前的方法:

 public static Queue<Integer> getPrimes(int n) throws IllegalArgumentException
{
    if (n<2)
    {
        throw new IllegalArgumentException();
    }

    Queue<Integer> integers = new LinkedList<Integer>();
    Queue<Integer> primes = new LinkedList<Integer>();
    for (int i = 2; i <= n ; i++) {
        integers.add(i);
    }
    boolean[] isMultiple = new boolean[n + 1];

    for(int iterate = integers.remove(); iterate <= n; iterate++)
    {

        if(!isMultiple[iterate])
        {
            primes.add(iterate);
            for(int multiples = iterate * iterate; multiples >= 0 && multiples <= n; multiples += iterate)
            {
                isMultiple[multiples] = true;
            }
        }
    }
    return primes;
}

共有2个答案

乐正烨熠
2023-03-14

作为第一个小步骤,您可以删除整数队列并将其替换为常见的for循环

for (int iterate = 2; iterate < n; iterate++)
{
     if (!isMultiple[iterate]) 
     {
         ...
     }
}
章德惠
2023-03-14

首先可以用两种方法优化它:1)不需要整数linkedlist。而是使用一个简单的for循环。

2)使用for循环后,您可以首先删除所有偶数,因为它们显然可以被2整除。然后遍历奇数。从而将循环减半。

代码段:

    primes.add(2);
    for(int i=2;i*i<=n;i++)
    {
        isMultiple[2*i]=true;
    }
    for(int i=3;i*i<=n;i+=2)
    {
        if(!isMultiple[i]) 
        {
            primes.add(i);
            for(int j=i*i;j<n;j+=i)
            {
               isMultiple[j]=true;
            }
        }
    }
    return primes;
 类似资料:
  • 有没有一个简单的pari/gp程序可以筛选k*n c(其中n和c是固定的)形式的数,直到某个素数p,并且k被限制在某个范围内(即k=1,10000,) 伪代码: 换句话说,从整数列表 T 开始 检验素数范围 p 中的第一个素数,并从列表 T 中删除整数 k,使得 k*n c 可以被 p 整除。然后测试下一个素数,依此类推。执行此操作,直到达到筛子返回的极限,或打印候选列表。感谢您的帮助!

  • 我正在使用自定义列表视图来显示图像和文本。下面是我的列表视图项的布局文件和后面的代码。我会在帖子的底部解释我的问题。 下面是将必要信息加载到列表视图中的后端代码。 12-21 03:54:20.827:D/OpenGrenderer(1248):启用调试模式0 12-21 03:54:20.955:我/编舞(1248):跳过36帧!应用程序可能在其主线程上做了太多的工作。 12-21 03:54:

  • 我们看到ORC和带分区的ORC执行相同(有时我们看到B/W ORC分区和不带分区的ORC差别很小)。带分区的ORC会比ORC表现更好吗。带分区桶的ORC会比ORC分区表现更好吗?。我看到每个ORC分区文件都接近50-100 MB,ORC带外分区(每个文件大小为30-50 MB)。 **注:120 GB的Un压缩数据被压缩为17 GB的ORC文件格式

  • 我有这个在重复播放 来自网站数组的每个网站对象如下所示: 问题:如何将过滤器应用于上述循环,使其仅显示属性为空数组的元素? 我尝试过的事情: (控制台中没有错误,但会过滤掉所有内容) (与我想要的相反,只显示组不是空数组的项目) (如果我用null代替[]来表示没有值,这是可行的,但看起来真的很混乱……因为我需要经常注意组属性变为空,并手动将其设置为null)

  • 我们正在尝试使用Apache Phoenix驱动程序来提高HBase设置的读取性能,以对抗约1150万条记录的数据集。 HBase 0.98 Apache Phoenix driver 4.3.1 Squirrel Client 3.2 该表由21列组成,下面是DDL语句: 我们已经对表执行了salting(salt buckets=3),并在所有列上创建了一个辅助索引(不可变索引)。 我们执行以

  • 我一直在尝试Codility.com的编码挑战,这是我尝试的问题之一: 给出一个由 N 个整数组成的非空零索引数组 A。一对整数 (P, Q),使得 0 ≤ P 例如,数组A如下: 包含以下示例切片: 切片 (1, 2),其平均值为 (2 2) / 2 = 2;切片 (3, 4),其平均值为 (5 1) / 2 = 3;切片 (1, 4),其平均值为 (2 2 5 1) / 4 = 2.5。目标是