通过引用访问矢量元素是否会降低C++的空间复杂性?



我有一个简单的C++算法来处理来自向量的元素。我通过引用向量传递函数,并使用 foreach 循环通过引用访问向量的元素,如下所示:

vector<int>& gradingStudents(vector<int>& grades) {
for(int& grade : grades) {
if (grade > 37) {
int n = grade % 5;
if (n >= 3)
grade += (5 - n);
}
}
return grades;
}

我的问题是,考虑到空间复杂度由辅助空间和输入空间组成,说我的算法的空间复杂度是线性的(因为输入大小可能会有所不同(是否正确?还是空间复杂性恒定,因为输入已经存在于内存中(它只是被引用(,除了我的临时n变量之外不需要额外的空间?

由于您只使用与向量相关的引用,因此不需要更多内存。你唯一的写入是grade += (5-n),就像任何int(或数字类型(一样,这发生在变量当前被寻址的地方 - 在这种情况下是向量本身。

据我所知,您在此处分配了一个额外的 int,并且没有使用其他"辅助"空间。也许另一个用于引用(如指针(,尽管我不确定,因为实现可能使用grades+int_offset直接访问变量而无需额外的指针。

空间复杂度是常数,因为输入已经存在于内存中(它只是被引用(,除了我的临时 n 变量之外不需要额外的空间?

是的。

时间复杂度为 O(grade.size(((,空间复杂度为 O(1(。

但是,如果删除引用,则由符号描述的渐近时间复杂度O或更准确地说,θ不会在此处更改。因为这只会影响访问每个元素所花费的时间常量。

另外,复制int不会花费太多时间,它应该与基于范围的没有引用的版本几乎相同的速度(甚至更快,因为引用通常也由指针实现(。

最新更新