哈希表、数组、数组列表、链表等的空间复杂度是什么?

2 投票
3 回答
5770 浏览
提问于 2025-04-16 00:20

我想了解一些流行编程语言中基本数据结构的空间复杂度。

3 个回答

1

几乎所有大小不小的数据结构,其大小都是在 n 的范围内。

  • 数组 = 正好是 n
  • 数组列表 = 在 n 和 k*n 之间(默认 k=2)
  • 链表 = 正好是 n
  • 哈希表 = 最坏情况下是 n/k(默认 k 是 0.75)
2

对于Java来说:(大致估算)

            Memory O(x) | General Case
Array     |       n     |    n
ArrayList |       n     |    2 * n
LinkedList|       n     |    n * (node size)
HashTable |       n     |    ~n
Map       |       n     |    (n * key_size) + n
3

这些东西的空间复杂度都是 O(n)。唯一不同的就是系数,这完全取决于具体的实现方式。尤其是当你开始考虑像预先分配空间来减少时间复杂度时,这一点就更明显了。

举个例子,数组列表结构通常会预先分配一些额外的空间。因此,它们对于一定数量的对象的确切复杂度其实是一个范围,这完全依赖于具体的实现以及它们是如何被创建和使用的。比如,如果我写一个数组列表,每次需要更多空间时总是分配三个额外的空间,而当有超过五个空闲空间时总是缩减到三个空闲空间,那么对于 n 的实际复杂度将是 [n, n + 5] + overhead

在编程时选择这些东西的主要区别通常在于使用的方便程度,以及它们与你的使用方式的契合度。例如,链表在随机访问时表现很糟糕,但在迭代时却非常出色。

撰写回答