什么';s向数组中添加元素的时间复杂性


What's the time complexity of adding an element to an array?

PHP的数组是复杂的野兽;它们允许像普通哈希表一样快速查找,但它们的键值对也是有序的。随着现有元素数量的增长,向该结构中插入元素的时间成本如何变化?

时间复杂性是否取决于我如何将元素插入数组?例如,执行以下每个操作:

array_unshift($array, $value);
array_push($array, $value);
array['some_new_key'] = $value;

具有相同的时间复杂性,还是不同的时间复杂性?

恒定时间O(1)

array_push是恒定时间(类似哈希表结构的队列函数),但一个有趣的注意事项是性能方面:

array_push();
$array[] = $val;

后一种方法比array_push更快,因为不需要为开销函数调用付费。

线性时间O(n)

毫无疑问,array_push和相关的队列函数比array_unshift快得多。是的,它们都具有相同的功能,但实现这一点的方式不同。正如您已经注意到的,PHP的数组非常强大,并提供了强大的功能。这是有代价的,因为PHP的数组已经排序了键,并且您需要支付额外的成本来重新索引所有这些键,所以O(n)。然后,array_unshift将采用数组的线性时间+将值附加到数组头的恒定时间,因此类似于O(n + cn'),其中c是将元素添加到数组的恒定时间并且n'是要添加的项的数量。

array_push($array, $value);

array['some_new_key'] = $value;

都是O(1)

array_unshift($array, $value);

是O(n),因为(更改"头")它必须打乱整个数组来处理排序