Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么';向数组中添加元素的时间复杂度是多少?_Php_Time Complexity - Fatal编程技术网

Php 什么';向数组中添加元素的时间复杂度是多少?

Php 什么';向数组中添加元素的时间复杂度是多少?,php,time-complexity,Php,Time Complexity,PHP是复杂的野兽;它们允许像普通哈希表一样快速查找,但它们的键值对也是有序的。随着现有元素数量的增加,将元素插入此结构的时间成本如何变化 时间复杂度是否取决于我将元素插入数组的方式?例如,执行以下每个操作: array_unshift($array, $value); array_push($array, $value); array['some_new_key'] = $value; 具有相同的时间复杂性,还是具有不同的时间复杂性 array_push($array, $value);

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

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

array_unshift($array, $value);
array_push($array, $value);
array['some_new_key'] = $value;
具有相同的时间复杂性,还是具有不同的时间复杂性

array_push($array, $value);

都是O(1)

是O(n),因为(更改“head”)它必须洗牌整个数组以处理排序

恒定时间O(1)
array\u push
是常数时间(类似哈希表结构的队列函数),但有趣的是,性能方面:

array_push();
$array[] = $val;
后一种方法比array\u push更快,因为无需支付开销函数调用的费用

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

这似乎是合理的,但是你有它的源代码,或者基于底层数据结构如何工作的详细解释吗?你可以听我的话,或者阅读,或者查看php源代码。。。。奇怪的是,我在PHPBarcelona做了一次演讲,其中包括了这个关于马克·贝克的问题——你的消息来源是什么?这是我所期望的,但我更喜欢权威参考或基于底层数据结构的解释,而不是信口开河。我的答案与Mark Baker基本相同,如果您愿意的话,这一点之前已经非常详细地介绍过了:,或者您可以阅读php源代码。另外,它在PHP站点中声明数组是作为哈希表实现的,这应该已经足够推断出它们的性能。我不认为所有这些都来自于对数据结构的肤浅了解;例如,如果数据结构的排序是通过存储键的链接列表来实现的,那么看起来似乎
array\u shift
可能是
O(1)
。至于您的第一个链接,它在PHP7之后就没有更新过。这对你来说可能非常明显,但在投票或接受任何东西之前,我将阅读更多内容。PHP7确实改变了许多事情的规则,但从技术上讲,在接下来的10天内不会公开发布yetO(n+cm),其中n是数组中的项目数,m是添加的项目数
array_unshift($array, $value);
array_push();
$array[] = $val;