You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

链表、数组的浪费空间参数解析:为何链表为O(n)、数组为0?

关于「浪费空间参数」的通俗解释及三种数据结构对比

嘿,这个问题问得很关键,我来给你拆解明白~

先搞懂:什么是「浪费空间参数」

简单来说,这个参数就是用来衡量一个数据结构在存下你需要的有效数据之外,额外多占了多少内存。用大O表示法的话,它反映的是随着数据量n变大,额外消耗的空间会跟着怎么增长——说白了就是看这个数据结构「内存利用率」的反向指标。

为啥数组的浪费空间是0?

这里说的数组特指完全被填满的静态数组:它是一块连续的内存块,你申请多大空间就全用来存有效数据,没有任何额外的附加信息(比如指针、预留空位)占用内存。比如你声明了一个能存8个整数的数组,刚好把8个整数全放进去,那所有分配的内存都用在了刀刃上,没有浪费,所以浪费空间参数是0。

那链表为啥是O(n)?

链表的每个节点都得「身兼两职」:除了存你要的有效数据(比如一个字符串、一个数字),还得额外存一个指针(单链表)或者两个指针(双向链表),用来指向它的下一个(或上一个)节点,这样整个链表才能串起来。

举个例子:假设每个数据占4字节,指针也占4字节,那每存一个有效数据,就得多花4字节的空间来存指针。当你有n个节点时,所有指针加起来的额外空间就是n×4字节,和n成正比,所以用O(n)来表示——相当于每存一份有效数据,就浪费了差不多一份额外空间,数据量越大,总浪费的空间跟着线性增长。

补充:动态数组的O(n)是咋来的?

动态数组(比如Python的list、Java的ArrayList)为了避免每次加元素都重新扩容、拷贝数据,会预先分配比当前需要更大的内存空间。比如你现在存了5个元素,它可能偷偷给你分配了10个位置的空间,空着的5个位置就是暂时浪费的。当元素填满时,它会再扩容到比如20个位置,每次扩容的冗余空间大概是当前容量的一半左右。总的算下来,随着n增长,最多会有差不多n/2的冗余空间,所以渐近复杂度也是O(n)

内容的提问来源于stack exchange,提问作者Piyush

火山引擎 最新活动