通过引用访问向量元素是否会降低 C++ 中的 space 复杂性?
Does accessing vector elements by reference reduce space complexity in 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;
}
我的问题是,考虑到 space 复杂度由辅助 space 和输入 space 组成,说我的算法的 space 复杂度是线性的是否正确(由于输入大小,可能会有所不同)?或者 space 复杂性常数是因为输入已经存在于内存中(它只是被引用)并且不需要额外的 space 除了我的临时 n
变量?
由于您仅使用与向量相关的引用,因此不需要更多内存。您唯一的写入是 grade += (5-n)
,并且像任何 int
(或数字类型)一样,这发生在变量当前寻址的地方 - 在这种情况下是向量本身。
据我所知,您在这里分配了一个额外的 int,没有使用其他 "auxiliary" space。也许是另一个参考(如指针),但我不确定,因为实现可能使用 grades+int_offset
直接访问变量而无需额外的指针。
is the space complexity constant because the input already exists in memory (it's simply referenced) and no extra space is needed except for my temporary n variable?
是的。
时间复杂度为O(grade.size()),space复杂度为O(1)。
但是,如果您删除引用,用符号 O
或更准确地说 θ
描述的渐近时间复杂度不会在此处改变。因为那只会影响访问每个元素所花费的时间常数。
另外,复制一个int
不会花太多时间,它应该和基于范围的for中没有引用的版本几乎一样的速度(甚至更快,因为通常也实现了引用通过指针)。
我有一个简单的 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;
}
我的问题是,考虑到 space 复杂度由辅助 space 和输入 space 组成,说我的算法的 space 复杂度是线性的是否正确(由于输入大小,可能会有所不同)?或者 space 复杂性常数是因为输入已经存在于内存中(它只是被引用)并且不需要额外的 space 除了我的临时 n
变量?
由于您仅使用与向量相关的引用,因此不需要更多内存。您唯一的写入是 grade += (5-n)
,并且像任何 int
(或数字类型)一样,这发生在变量当前寻址的地方 - 在这种情况下是向量本身。
据我所知,您在这里分配了一个额外的 int,没有使用其他 "auxiliary" space。也许是另一个参考(如指针),但我不确定,因为实现可能使用 grades+int_offset
直接访问变量而无需额外的指针。
is the space complexity constant because the input already exists in memory (it's simply referenced) and no extra space is needed except for my temporary n variable?
是的。
时间复杂度为O(grade.size()),space复杂度为O(1)。
但是,如果您删除引用,用符号 O
或更准确地说 θ
描述的渐近时间复杂度不会在此处改变。因为那只会影响访问每个元素所花费的时间常数。
另外,复制一个int
不会花太多时间,它应该和基于范围的for中没有引用的版本几乎一样的速度(甚至更快,因为通常也实现了引用通过指针)。