我正在实施埃拉托色尼筛。我被困在第一步:决定使用哪种数据结构。简而言之,埃拉托色尼筛法以一系列连续数字(例如 2、3、4、5、...99、100)开始。然后,某些数字被划掉,不再考虑。什么是最好的数据结构?限制(示例中为 100)直到运行时才知道,尽管 2 始终是起始数字。
我已经看到了一些不同的解决方案。限制n
是类型mpz_class
bool primes[n]
bool* primes
std::vector<bool> primes
std::bitset<n> primes
vector
使用参数int
,或者unsigned char
因为它们会比bool
- 对于基于向量和数组的解决方案,分配
n+1
元素(如此处所示)我猜这是这样的值n
将在最后一个元素处,并且在循环内需要更少的减法。
其中一些信息来自此代码审查问题。@Jamal 声明“实际上存在与 std::vector 相关的问题”,但没有详细说明。我也在某处红色,unsigned char
保证其大小等于或小于使其 bool
成为更好的选择。