【发布时间】:2018-11-28 23:41:54
【问题描述】:
查看 .NET System.Collections.Generic.Dictionary<T,T> 实现,我发现了一个方法 HashHelpers.IsPrime(n),它检查数字是否为素数。
我有点困惑,为什么他们使用非常简单的优化技术只测试从 3 开始的奇数。
(来自源代码)
int limit = (int)Math.Sqrt (candidate);
for (int divisor = 3; divisor <= limit; divisor+=2)
{
if ((candidate % divisor) == 0)
return false;
}
return true;
因此,他们将检查次数从 3 次减少到了限制。但更优化的是根据Wikipedia 对数字 6*k-1,6*k+1 进行测试,将测试减少 3 次。而且我认为对于素性检验还有更优化和更快的解决方案。
我知道,特别是 Dictionary<T,T> 实现它并不那么重要,因为它仅在大型字典中调用,并且在调整大小时非常罕见。但总的来说,它是一个框架,非常受知名公司的欢迎。也许存在一些逻辑,或者我在这里看不到什么?谢谢。
【问题讨论】:
-
好点。现在 .Net 是开源的,可以接受贡献,包括优化。
-
对于一般用例而言,哪种算法“最佳”并不总是很明显。值得注意的是best, Gödel-prize winning algorithm(无论如何,根据this post)是not currently of any practical use。