【问题标题】:what is the fastest algorithm to identify prime numbers from an array of random numbers?从随机数数组中识别素数的最快算法是什么?
【发布时间】:2019-01-12 09:59:07
【问题描述】:

我有一个随机数数组,我必须从该数组中返回素数。我熟悉 root(n) 解决方案(n 是那个特定的数字而不是数组的大小)。我不能应用 Eratosthenes 的筛子,因为它适用于一定范围内的数字,但这里的数字是完全随机的。

如果我遗漏了什么,请纠正我。 提前致谢!

【问题讨论】:

  • 要么从输入中获取最大值并使用筛子直到该数字,要么只为每个数字单独求解。有什么问题?
  • 我们是否必须使用额外的空间(如哈希)来使用筛子存储所有素数,然后检查给定的数字是否存在于其中?我想在不使用空间的情况下做到这一点。
  • “不使用空间”:你的问题中没有提到。相反,您告诉我们您考虑过筛子,但拒绝了它,不是因为它需要空间,而是因为数字是随机的。
  • I am familiar with root(n) solution 我什至不知道我是不是:请在你的帖子中画出来。

标签: algorithm random time-complexity primes primality-test


【解决方案1】:

您正在寻找素数测试。您应该能够搜索并找到很多可能性。这是我几年前写的一个答案,可能比你想要的要多:

Fastest way to find if a given number is prime

大部分细节都针对大于 64 位的数字,其中有很多可能的题外话和选择。对于 64 位输入,简单而合理的答案是使用一个小试除法,然后使用一组精心设计的 Miller-Rabin 测试,这些测试给出确定性结果(既没有使用随机性,也没有错误的可能性,如果正确实施)。如果您想稍微优化一下,则需要考虑散列集和 BPSW。

附录:如果输入的数量远大于最大输入大小或唯一输入的数量,或者存在某种分布(例如期望),则可以更快地完成某些情况许多重复的输入。然后,诸如缓存或生成用于快速查找的位集之类的解决方案可能会更快。输入集的知识有很大帮助。

【讨论】:

    【解决方案2】:

    如果空间很重要并且您熟悉 c++,则可以使用 bitset 代替 bool,这将提高 8 倍,因为 bool 使用 8 位作为元素,而 bitset 仅使用一位来存储值 1 或 0 ;

    const int SIZE = 1000000;
    const int LIMIT = sqrt(SIZE)+1;
    
    bitset<SIZE> prime;
    
    void sieve() {
        prime.flip();
        prime[1]=0;
        for(int i=2;i<=LIMIT;i++) {
            if (prime[i])
                for(int j=2*i;j<SIZE;j+=i)
                    prime[j]=0;
        }
    }
    
    bool isPrime(int n) {
        return prime[n];
    }
    

    【讨论】:

    • 你可以将prime的大小减半,方法是在isPrime()中只保留奇数并分别处理2。
    【解决方案3】:

    每个素数都与 6n 相邻(其中 n>=1 )。

    首先检查一个数字是否与 6 的倍数相邻。

    如果数字相邻,则对该数字应用素数测试算法。 6n 方法的理由: https://www.youtube.com/watch?v=ZMkIiFs35HQ

    【讨论】:

      猜你喜欢
      • 2016-12-20
      • 2010-10-02
      • 2012-02-01
      • 2012-02-05
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      相关资源
      最近更新 更多