python - 数据与素数成正比的素数筛的空间复杂度是多少?

标签 python primes space-complexity sieve sieve-of-atkin

我正在练习编写针对空间或时间复杂度进行了优化的算法。使用质数筛,您至少必须存储找到的所有质数的列表。与找到的素数成比例的数据似乎是这种算法可能使用的最少空间量。

  • 这个理由有效吗?
  • 如何评估该算法的空间复杂度?

From Wikipedia about the sieve of Atkin - 我不确定的是,当素数超过此值时,筛子如何使用 O(n^1/2) 空间。这就是为什么看起来至少空间必须与素数的数量成正比。我是否将可数数与空间复杂度混淆了?

In this paper on the sieve of Atkin ,他们的算法打印“最多 N 个素数……这里的‘内存’不包括打印机使用的纸张。”这似乎是一种不公平的空间计算。

  • 我希望澄清这应该如何/实际上如何客观地衡量。
def prime_sieve(limit):
    factors = dict()
    primes = []
    factors[4] = (2)
    primes.append(2)
    for n in range(3, limit + 1):
        if n not in factors:
            factors[n * 2] = (n)
            primes.append(n)
        else:
            prime = factors.get(n)
            m = n + prime
            while m in factors:
                m += prime
            factors[m] = (prime)
            del factors[n]
    return primes

最佳答案

这个算法的空间复杂度是len(numbers) + len(primes);列表的大小加上字典的大小。

在这种情况下,该算法比您对朴素素筛 (limit) 的预期要差len(numbers) + len(primes) > limit 因为例如对于 prime_sieve(100),以下不相关的数字存储在 numbers 中:

{129: 43, 134: 67, 141: 47, 142: 71, 146: 73, 158: 79, 166: 83, 178: 89, 194: 97, 102: 17, 104: 2, 105: 3, 106: 53, 110: 11, 111: 37, 112: 7, 114: 19, 115: 23, 116: 29, 117: 13, 118: 59, 120: 5, 122: 61, 123: 41, 124: 31}

有几种素数筛法,具有不同的时间和空间复杂度;参见例如Wikipedia和类似 How do i reduce the space complexity in Sieve of Eratosthenes to generate prime between a and b? 的问题

此外,请注意,不需要 prime = numbers.get(n) - 您已经检查过 if n not in numbers,因此您可以使用素数 = 数字[n]

关于python - 数据与素数成正比的素数筛的空间复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26462855/

相关文章:

python - setup.py sdist 排除子目录中的包

functional-programming - 调用后构建 n 大小数组的函数的空间复杂度

time-complexity - 递归运行时 - 空间复杂性(Cracking the Coding Interview 第 44 页)

python - 条件循环

python - 如何在将python函数绑定(bind)到对象之前检查它是否是方法?

用于检查素数不起作用的 C++ 代码

python-3.x - 查找代码中的逻辑错误以获取前 50 个素数

arrays - 给定一个整数数组,在线性时间和常量空间中找到第一个缺失的正整数

python - 为类 Markdown 语言实现解析器

c - 求素数的位置