【发布时间】:2020-08-29 04:49:22
【问题描述】:
我有一个简单的 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变量之外不需要额外的空间?
【问题讨论】:
-
虽然引用看起来似乎没有占用空间(它们是 Reference 其他东西),但在实现方面这可能是不可能的。编译器可能能够优化
grade以不占用内存空间(例如通过使用 CPU 寄存器),但其他引用通常作为指针实现,并且指针也需要空间(在典型的 64 位系统上指针通常比int值使用 更多 空间)。 -
话虽如此,在典型的 PC 型系统(包括手机等系统)上,除非您已测量,否则不需要此类微优化前两个问题。由于您修改了向量及其内容,因此您实际上无法选择是否使用引用。
-
这在很大程度上取决于您如何定义空间复杂度。通常,该术语涵盖所有数据,包括输入数据。在这种情况下,您的算法的空间复杂度是线性。经常使用附加术语辅助空间复杂度,它仅定义算法使用的辅助/临时数据(不包括输入)。在这种情况下,您的算法的辅助空间复杂度是常量。
标签: c++ algorithm vector space-complexity