首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单程算法(需要澄清)为什么空间复杂度是O(1)?

单程算法(需要澄清)为什么空间复杂度是O(1)?
EN

Stack Overflow用户
提问于 2019-12-06 03:08:09
回答 1查看 256关注 0票数 0

来自en.wikipedia

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

我用xdebug.profiler_enable=1做了一个测试:

代码语言:javascript
复制
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);

Qcache差中该代码的内存使用量为: 33,558,608字节,所有这些字节都由range()函数使用。

在我看来,这个部分是可以的,因为在onePassAlgorithm函数中,我们只有两个int变量。

这就是为什么空间复杂性是O(1)的原因。

然后我又做了一个测试:

代码语言:javascript
复制
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字节(返回语句的大小)。难道我们不需要更多的顺序保存在$seen_nums变量中吗?那么,空间复杂度是O(1)吗?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-07 07:08:28

来自Xdebug文档:

2007-05-17 -删除了对内存分析的支持,因为它不能正常工作。

2015-02-22-XDebu2.3.0增加了函数的时间索引和内存使用,在正常的跟踪文件中返回

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59206281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档