我在接受采访时得到了这个问题
请提供一个解决方案,以检查数字是否为使用的素数 一个循环 - O(1)。输入数字可以介于1到10,000之间 仅
我说这是不可能的,除非你已经存储了所有素数高达10,000。现在我不完全确定我的答案是否正确。我试图在互联网上搜索答案,最好的我想出了运行时为O的AKS算法((log n)^ 6)
答案 0 :(得分:0)
使用SoE (Sieve of Eratosthenes)可行。其结果是bool
的数组通常在BYTE/WORD/DWORD
数组中编码为单个位,以获得更好的存储密度。通常只有奇数存储为偶数,除了2都不是素数。通常真值意味着它不是素数......
因此,检查O(1)
的天真x
C ++ 代码如下所示:
bool SoE[10001]; // precomputed sieve array
int x = 27; // any x <0,10000>
bool x_is_prime = !SoE[x];
如果 SoE 被编码为8位BYTE
数组,则需要稍微调整一下访问权限:
BYTE SoE[1251]; // precomputed sieve array ceil(10001/8)
int x = 27; // any x <0,10000>
BYTE x_is_prime = SoE[x>>3]^(1<<(x&7));
粗构造 SoE 不是O(1)
!!!这里有一个大量使用它来加速我的IsPrime
函数的例子:
答案 1 :(得分:0)
是的!, 您可以使用 Eratosthenes 筛来检查数字是否为素数, 但是,您必须预先计算一定数量的值并将其存储在数组中,并且对于每个查询,您都可以在 O(1) 中进行检查。
如果你不想预先计算,因为它需要 O(log(long)) 时间,那么你可以使用这个概念,
如果 P 是素数,则 P^2 - 1 可以被 24 整除。 所以在 C++ 的情况下,如果给定的数字小于或等于 10^9 ,我们可以使用这个概念。
这个概念的来源可以在www.brilliant.org