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),因为(更改"头")它必须打乱整个数组来处理排序