看着.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>
的实现并不是那么重要,因为它仅适用于大型词典,并且在极少数情况下需要调整大小。但总的来说,这是一个框架,在知名公司中非常受欢迎。也许有些逻辑存在,或者我在这里看不到什么?谢谢。
答案 0 :(得分:16)
我认为素数测试有更多的最佳和更快的解决方案。
是的
也许有些逻辑存在,或者我在这里看不到东西?
不。您已经准确地总结了这种情况。
您问:
为什么在.Net HashHelpers.IsPrime中以非最佳方式实现?
然后您回答自己的问题:
我了解到特别是
Dictionary<T,T>
的实现并不是那么重要,因为它仅适用于大型词典,并且在极少数情况下需要调整大小。
因此您知道问题的答案。 未优化,因为从定义上讲足够快,并且给定的算法也足够快。
如果您想使其更快,嘿,它是开源的。开始实施您更喜欢的算法,并提交经过精心设计,准确而精确的经验性能测试的详细结果,该结果清楚地表明对广泛使用的基础功能进行了不必要的更改< / strong>在不重要且罕见的情况下被您的卓越性能算法所证明。
如果听起来这很费劲,几乎没有好处,那么您再一次知道问题的答案。收益不大的昂贵工作被排在优先级列表的底部。