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

时间:2019-12-06 03:08:09

标签: php algorithm profiling big-o qcachegrind

来自en.wikipedia

  

单遍算法通常需要O(n)(请参见“大O”表示法)时间,并且少于O(n)的存储时间(通常为O(1)),其中n是输入的大小。

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

function onePassAlgorithm(array $inputArray): int
{
    $size = count($inputArray);
    for ($countElements = 0; $countElements < $size; ++$countElements) {
    }

    return $countElements;
}

$range = range(1, 1_000_000);
$result = onePassAlgorithm($range);

此代码在qcachegrind中的内存使用量为:33 558 608字节,而全部100%都由range()函数使用。
在我看来,这部分还可以,因为在onePassAlgorithm函数中,我们只有两个int变量。
这就是空间复杂度为O(1)的原因。

然后我进行了另一项测试:

function onePassAlgorithm(array $inputArray, int $twoSum): array
{
    $seen_nums = [];
    foreach ($inputArray as $key => $num) {
        $complement = $twoSum - $num;
        if (isset($seen_nums[$complement])) {
            return [$seen_nums[$complement], $key];
        }
        $seen_nums[$num] = $key;
    }

    return [];
}

$range = range(1, 1_000_000);
$result = onePassAlgorithm($range, 1_999_999);

在qcachegrind中,我们可以看到onePassAlogorithm函数仅使用376个字节(return语句的大小)。我们是否不需要更多内容来依次保存在$ seen_nums变量中?那么空间复杂度又是O(1)吗?

result of the second code in qcachegrind

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

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

1 个答案:

答案 0 :(得分:0)

来自Xdebug文档:

[2007-05-17] —删除了对内存配置文件的支持,因为它无法正常工作。

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

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