Php 一次通过算法(需要澄清)为什么空间复杂度为O(1)?

Php 一次通过算法(需要澄清)为什么空间复杂度为O(1)?,php,algorithm,profiling,big-o,qcachegrind,Php,Algorithm,Profiling,Big O,Qcachegrind,发件人: 一次通过算法通常需要O(n)(参见“大O”表示法)时间和小于O(n)的存储(通常为O(1)),其中n是输入的大小 我使用xdebug.profiler_enable=1进行了测试: 函数onePassAlgorithm(数组$inputArray):int { $size=计数($inputArray); 对于($countElements=0;$countElementsnum的输入阵列){ $complete=$twoSum-$num; 如果(isset($seen_nums[$c

发件人:

一次通过算法通常需要O(n)(参见“大O”表示法)时间和小于O(n)的存储(通常为O(1)),其中n是输入的大小

我使用xdebug.profiler_enable=1进行了测试:

函数onePassAlgorithm(数组$inputArray):int
{
$size=计数($inputArray);
对于($countElements=0;$countElements<$size;++$countElements){
}
返回$countElements;
}
$range=范围(1,1,000,000);
$result=onePassAlgorithm($range);
此代码在qcachegrind中的内存使用量为:33 558 608字节,其中100%都被range()函数使用。
这一部分在我看来还可以,因为在onePassAlgorithm函数中,我们只有两个int变量。
这就是为什么空间复杂度是O(1)

然后我做了另一个测试:

函数onePassAlgorithm(数组$inputArray,int$twoSum):数组
{
$seen_nums=[];
foreach($key=>num的输入阵列){
$complete=$twoSum-$num;
如果(isset($seen_nums[$complete])){
返回[$seen_nums[$complete],$key];
}
$seen_nums[$num]=$key;
}
返回[];
}
$range=范围(1,1,000,000);
$result=onePassAlgorithm($range,1_999_999);
在qcachegrind中,我们可以看到onePassAlogorithm函数只使用376字节(返回语句的大小)。我们不需要更多来顺序保存在$seen\u nums变量中吗?那么空间复杂度又是O(1)

我的问题是:为什么qcachegrind显示我们复制整个$inputArray的变量$seen_nums不消耗内存


或者换句话说,为什么我第二次实现此算法的存储复杂性为O(1)?

来自Xdebug文档:

[2007-05-17]-删除了对内存分析的支持,因为它无法正常工作

[2015-02-22]-Xdebug 2.3.0 添加了正常跟踪文件中函数返回的时间索引和内存使用情况


因此,我感到困惑的原因是xdebug配置文件只显示函数返回的内存使用情况,而不是我所期望的完整内存配置文件。

第一个配置文件可能更快,因为它在循环中不做任何事情?@greybeard它是$inputArray,重新命名。也许qcachegrind没有告诉你你认为它在告诉你什么。