- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
关注 .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>
实现它并不是那么重要,因为它只在巨大的字典中被调用,并且在极少数情况下会在调整大小时被调用。但总的来说,它是一个框架,非常受知名公司欢迎。也许存在一些逻辑或者我在这里没有看到什么?谢谢。
最佳答案
I think there's even more optimal and faster solutions for primality test.
是的。
Maybe some logic exists or I don't see something here?
没有。您已经准确地总结了情况。
你问:
Why in .Net HashHelpers.IsPrime is implemented in a non-optimal way?
然后你回答你自己的问题:
I understand that in particular
Dictionary<T,T>
implementation it's not so important because it is called only for huge dictionaries and in pretty rare cases while resizing.
所以您知道问题的答案。 它没有优化,因为根据定义,足够快就是足够快,并且给定的算法也足够快。
如果你想让它更快,嘿,它是开源的。去实现你更喜欢的算法,并提交你精心设计的、准确和精确的经验性能测试的详细结果,这些测试清楚地表明对广泛使用的基础功能进行不必要的更改 在不重要且罕见的情况下,您的卓越性能算法证明了这一点。
如果这听起来像是几乎没有任何好处的大量工作,那么您知道问题的答案了。成本高但 yield 小的工作排在优先级列表的底部。
关于c# - 为什么在.Net中HashHelpers.IsPrime是这样实现的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938060/
我正在研究 .NET 的字典实现,发现了一个我很好奇的函数:HashHelpers.GetPrime。 它所做的大部分工作都非常简单,它会寻找一个大于某个最小值的质数,并将其作为参数传递给它,显然是为
我是一名优秀的程序员,十分优秀!