我在某个地方遇到了一个问题,但对我的回答并不满意。
QTN: 你给出了一个数字列表,可以是100亿个数字。 现在你必须找出所有这些中最重要的一个。
我回答说,为了找到一个素数,我们不得不遍历数十亿的循环 并逐一检查天气是不是。 我们可以在这里进行一些优化检查,如果不是甚至我们都不会检查,因为素数不能是偶数。 并且存储no我们可以使用double数组,因为double是8字节的大小所以它也可以处理十亿个数字。 但似乎他还不满意。 请在这里帮助这里可能更合理的答案。 谢谢!
答案 0 :(得分:0)
假设我们将素数存储在数组中。根据{{3}}:
当算法终止时,您将在阵列中存储10 10以下的所有素数。
要查找小于或等于20的所有素数,过程将为:
首先生成一个从2到20的整数列表:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
列表中的第一个数字是2;通过从2开始以2为增量从2开始计算,将列表中的每个第2个数字交叉出来(这些将是列表中2的所有倍数):
2 3
45 s <6> 78910 s / s> 121314151617181920
2之后列表中的下一个数字是3;通过从3开始以3为增量从3开始计算,从而将列表中的每第3个数字删除(这些将是列表中3的所有倍数):
2 3 <4> 5
67 s <8>910 s / s> 111213141516181920< / p>
3之后列表中尚未划掉的下一个数字是5;通过从5开始以5的增量(即5的所有倍数)计数,在5中的每5个数字后面划出,但是这些数字(10,15,20)也是倍数,因此它们都被划掉了。较小的素数因为5 * 5大于20.此时列表中没有划掉的数字都是低于20的素数:
2 3 5 7 11 13 17 19
为了提高效率,正如您所说,您最初只能列出奇数,(3,5,....,10⁹),并以 2p 的增量从< em>p²在步骤3中,因此只标记 p 的奇数倍。
另一种提高效率的方法是,从p²开始标记步骤3中的数字,因为 p 的所有较小倍数都已标记为点。这意味着当p²大于10¹时,允许算法在步骤5终止。
如果内存不足并且需要在较小的范围内生成素数,您还可以查找分段扫描。