在计算机科学中，一个算法或程序的空间复杂度定性地描述该算法或程序运行所需要的存储空间大小。空间复杂度是相应计算问题的输入值的长度的函数，它表示一个算法完全执行所需要的存储空间大小。
和时间复杂度类似，空间复杂度通常也使用大O记号来渐进地表示，例如
  
    
      
        O
        (
        n
        )
      
    
    {\displaystyle O(n)}
  
、
  
    
      
        O
        (
        n
        log
        ⁡
        n
        )
      
    
    {\displaystyle O(n\log n)}
  
、
  
    
      
        O
        (
        
          n
          
            α
          
        
        )
      
    
    {\displaystyle O(n^{\alpha })}
  
、
  
    
      
        O
        (
        
          2
          
            n
          
        
        )
      
    
    {\displaystyle O(2^{n})}
  
等；其中n用来表示输入的长度，该值可以影响算法的空间复杂度。
就像时间复杂度的计算不考虑算法所使用的空间大小一样，空间复杂度也不考虑算法运行需要的时间长短。


空间复杂度类 复杂度类是渐进复杂度相同的一类问题的集合。与时间复杂度类DTIME(f(n))、NTIME(f(n))相似，空间复杂度类DSPACE(f(n))和NSPACE(f(n))分别表示可以被确定型和非确定型图灵机上使用
  
    
      
        O
        (
        f
        (
        n
        )
        )
      
    
    {\displaystyle O(f(n))}
  
大小的空间可以决定的语言的集合。此外，与P、NP类似，如果令
  
    
      
        f
      
    
    {\displaystyle f}
  
可以是任意多项式，就得到复杂度类PSPACE和NPSPACE。具体的定义为

  
    
      
        
          
            P
            S
            P
            A
            C
            E
          
        
        =
        
          ⋃
          
            c
            ∈
            
              
                Z
              
              
                +
              
            
          
        
        
          
            D
            S
            P
            A
            C
            E
          
        
        (
        
          n
          
            c
          
        
        )
      
    
    {\displaystyle {\mathsf {PSPACE}}=\bigcup _{c\in \mathbb {Z} ^{+}}{\mathsf {DSPACE}}(n^{c})}
  

和

  
    
      
        
          
            N
            P
            S
            P
            A
            C
            E
          
        
        =
        
          ⋃
          
            c
            ∈
            
              
                Z
              
              
                +
              
            
          
        
        
          
            N
            S
            P
            A
            C
            E
          
        
        (
        
          n
          
            c
          
        
        )
      
    
    {\displaystyle {\mathsf {NPSPACE}}=\bigcup _{c\in \mathbb {Z} ^{+}}{\mathsf {NSPACE}}(n^{c})}
  


复杂度类之间的关系 根据空间层次定理，对于任意的空間可構函數
  
    
      
        f
        (
        n
        )
      
    
    {\displaystyle f(n)}
  
，总存在这样一个问题，它可以被一个图灵机使用
  
    
      
        f
        (
        n
        )
      
    
    {\displaystyle f(n)}
  
存储空间求解，但不能被任何图灵机用渐进少于
  
    
      
        f
        (
        n
        )
      
    
    {\displaystyle f(n)}
  
的存储空间求解。
以下复杂度类之间的包含关系是成立的：

  
    
      
        
          
            D
            T
            I
            M
            E
          
        
        
          (
          
            f
            
              (
              n
              )
            
          
          )
        
        ⊆
        
          
            D
            S
            P
            A
            C
            E
          
        
        
          (
          
            f
            
              (
              n
              )
            
          
          )
        
        ⊆
        
          
            N
            S
            P
            A
            C
            E
          
        
        
          (
          
            f
            
              (
              n
              )
            
          
          )
        
        ⊆
        
          
            D
            T
            I
            M
            E
          
        
        
          (
          
            2
            
              O
              
                (
                
                  f
                  
                    (
                    n
                    )
                  
                
                )
              
            
          
          )
        
      
    
    {\displaystyle {\mathsf {DTIME}}\left(f\left(n\right)\right)\subseteq {\mathsf {DSPACE}}\left(f\left(n\right)\right)\subseteq {\mathsf {NSPACE}}\left(f\left(n\right)\right)\subseteq {\mathsf {DTIME}}\left(2^{O\left(f\left(n\right)\right)}\right)}
  

另外，根据萨维奇定理，如果
  
    
      
        f
        ∈
        Ω
        (
        log
        ⁡
        (
        n
        )
        )
      
    
    {\displaystyle f\in \Omega (\log(n))}
  
，则

  
    
      
        
          
            N
            S
            P
            A
            C
            E
          
        
        
          (
          
            f
            
              (
              n
              )
            
          
          )
        
        ⊆
        
          
            D
            S
            P
            A
            C
            E
          
        
        
          (
          
            
              (
              
                f
                
                  (
                  n
                  )
                
              
              )
            
            
              2
            
          
          )
        
        .
      
    
    {\displaystyle {\mathsf {NSPACE}}\left(f\left(n\right)\right)\subseteq {\mathsf {DSPACE}}\left(\left(f\left(n\right)\right)^{2}\right).}
  

上边结果的一个直接推论是
  
    
      
        
          
            P
            S
            P
            A
            C
            E
          
        
        =
        
          
            N
            P
            S
            P
            A
            C
            E
          
        
      
    
    {\displaystyle {\mathsf {PSPACE}}={\mathsf {NPSPACE}}}
  
。这个推论意味着对于一个问题而言，非确定性可以为图灵机节省的存储空间是相当有限的。作为对比，在时间复杂度理论中，指数时间假说猜想，对于时间复杂度而言，非确定型和确定型空间复杂度类之间的差距可能是指数级的。
根据Immerman–Szelepcsenyi定理，对于
  
    
      
        f
        ∈
        Ω
        (
        log
        ⁡
        (
        n
        )
        )
      
    
    {\displaystyle f\in \Omega (\log(n))}
  
，
  
    
      
        
          
            N
            S
            P
            A
            C
            E
          
        
        (
        f
        (
        n
        )
        )
      
    
    {\displaystyle {\mathsf {NSPACE}}(f(n))}
  
在取反操作下闭合(即若一个语言
  
    
      
        A
        ∈
        
          
            N
            S
            P
            A
            C
            E
          
        
        (
        f
        (
        n
        )
        )
      
    
    {\displaystyle A\in {\mathsf {NSPACE}}(f(n))}
  
，则其反语言
  
    
      
        
          A
          
            c
          
        
        =
        {
        x
        
          |
        
        x
        ∈
        A
        }
      
    
    {\displaystyle A^{c}=\{x|x\not \in A\}}
  
也在
  
    
      
        
          
            N
            S
            P
            A
            C
            E
          
        
        (
        f
        (
        n
        )
        )
      
    
    {\displaystyle {\mathsf {NSPACE}}(f(n))}
  
中)。这可能意味着空间和时间复杂度类在复杂度类关系上的另一个差别，因为一般认为非确定空间复杂度类在取反操作下不闭合，例如有猜想NP=co-NP。


对数空间复杂度类 对数空间复杂度类L（或写作LOGSPACE）是指确定性图灵机相对于输入
  
    
      
        n
      
    
    {\displaystyle n}
  
仅需
  
    
      
        O
        (
        log
        ⁡
        n
        )
      
    
    {\displaystyle O(\log n)}
  
存储空间就可以解决的问题的集合。考虑到一个最大取值为输入大小的计数器也需要
  
    
      
        n
      
    
    {\displaystyle n}
  
个二进制位，也即
  
    
      
        log
        ⁡
        n
      
    
    {\displaystyle \log n}
  
的存储空间；LOGSPACE中的一个算法至多只能使用常数个计数器或其它复杂度相同的变量。
LOGSPACE以及其它次线性空间复杂度的算法在处理输入大到存不进计算机的随机存取存储器的问题时很有用。解决这类问题的算法包括数据流算法；但次线性空间复杂度只考虑所需要的存储空间，而数据流算法同时还要考虑输入数据要怎样被送入算法中。
此复杂度类的算法在伪随机性和去随机化中也有应用，当前的相关开放问题包括L = RL是否成立。
与L对应的非确定性空间复杂度类是NL。


辅助空间复杂度 术语辅助空间是指除被输入数据占据的空间之外使用的存储空间。
因此，可以用以下方式来定义辅助空间复杂度：考虑一台拥有两条纸带的图灵机，其中一条“输入带”只能读不能写，另一条一般的纸带则可读可写。
则辅助空间复杂度只分析第二条纸带（即作业纸带，working tape）上的空间使用情况。
例如，对于平衡二叉树的深度优先搜索算法，若二叉树有
  
    
      
        n
      
    
    {\displaystyle n}
  
个节点，则其辅助空间复杂度是
  
    
      
        Θ
        (
        log
        ⁡
        n
        )
      
    
    {\displaystyle \Theta (\log n)}
  
。


参见 计算复杂性理论
时间复杂度
空间阶层定理


参考资料