【发布时间】:2016-10-29 20:04:39
【问题描述】:
我即将实施Sieve of Eratosthenes 并且有一个关于筛阵列的一般性问题。
我现在已经多次(在 C 中)实现了筛子,并且总是使用 uint8_t 的数组(在 <stdint.h> 中)作为筛子。这是相当低的内存效率,因为每个数字都使用 8 位进行筛选,即使一位应该就足够了。
我将如何在 C 中解决这个问题?我需要一个位数组。我几乎可以创建任何类型的数组(uint8_t、uint16_t、uint32_t、uint64_t)并使用位掩码等访问单个位。
我应该更喜欢什么数据类型以及我应该使用什么操作来访问这些位而不损失性能?
PS:我不认为这是 just BitArray 实现的副本,因为它的问题是关于 Eratosthenes 筛的具体问题,因为它的主要性质需要高效(不仅在内存使用中,但在访问中)。我在想,也许可以使用不同的技巧来提高筛分过程的效率......
【问题讨论】:
-
我会说与 Eratosthenes 筛子的有效实现的链接足以使这个 not 与另一个问题重复。我觉得这是一个有趣的问题,应该重新讨论。
-
可以通过忽略筛子中的偶数(因为只有
2是素数)来提高内存效率,所以8位可以代表16个数字的状态。 -
@JohnColeman 提到筛子几乎无关紧要:如果第一段被删除,这个问题仍然有意义(稍作修改)。即使它不是重复的,它也应该作为 Too Broad 或 Off Topic 关闭(没有代码,没有针对实际问题显示的研究工作)。
-
在问题编辑之后,可能在 CodeReview 上 - 使用代码 ;)
-
@WeatherVane 我也在考虑这个问题。谢谢 :) 我认为通过一些巧妙的技巧,也可以留下 3 和 5 的倍数。问题是在哪里停止/技巧变得比实际计算更复杂/更难计算。
标签: c arrays bit-fields sieve-of-eratosthenes sieve