在哈希集中保留非素数与创建布尔数组之间的 space 和时间复杂度有何区别?

What is the difference in space and time complexity between keeping non-primes in a hashset vs. creating an array of Booleans?

给定一个整数n,并告诉我return从1到n的所有素数

我知道这个问题已经在这里回答了很多次,但我的问题是围绕跟踪非素数的两种方法。这两种方法是:

  1. 创建一个array of size n,其中每个索引代表从1到n的数字,如果不是素数则用Boolean (i.e. True or False)标记每个条目; the array is initially empty,但是当我们遇到素数时,我们会将素数的所有倍数标记为 False(即不是素数)在我们的数组中,这样当我们得到数字时我们不需要 'check' 如果它是素数。否则,我们将 'check' 通过尝试从 0 到该数字的模数来判断该数字是否为质数。

  2. 创建一个 set() 并按照 1 从 0 迭代到 n。每次我们 运行 将其所有倍数存储在该集合中,并且对于从 0 到 n 的每一个数字,我们首先检查它是否在这个集合中,然后再测试它是否是素数。

上述两种方法在时间和Space复杂度方面有什么不同吗?

TLDR:从 big-Oh 的角度来看,它们在时间和 space 上都是等价的。然而,在实践中,存在显着差异。

时间复杂度:我们正在处理所有数字,在两种情况下都设置所有倍数 (N/2 + N/3 + N/5+ ...)。在这两种情况下,设置标志都需要 O(1) 时间。在这两种情况下,space 复杂度都是 O(n)。

区别在于,list 每个布尔值只占用几个字节。 Set 也使用相同的几个字节来存储值,但还必须存储密钥哈希、维护冲突记录和处理调整大小。虽然这一切仍然归结为渐近 O(1) 复杂度,但它在实践中有一个相当大的常量乘数。