我们如何以恒定的复杂度交换 2 个数组或O(1)
?我们有办法做到这一点吗?我尝试过使用指针,但出现错误
此外,这不会有帮助,因为它只是交换指针而不是数组:
#include <algorithm>
int AA[100], *A=AA, BB[100], *B=BB;
swap(A, B);
我也尝试过使用向量赋值运算符,但它们具有线性复杂性,即O(N)
不是恒定的。那么,有什么办法可以交换两个数组吗?O(1)
? (通过使用指针或其他东西)
我尝试在互联网上搜索并找到了 codeforces 的链接(http://codeforces.com/blog/entry/11971 http://codeforces.com/blog/entry/11971)但这没有帮助。
Using std::swap
(使用成员函数 swap)对于向量(std::vector
)的复杂度为O(1)
.
来自 C++ 标准:
void swap(vector& x);
10 效果:将*this 的内容和capacity() 与x 的内容和capacity() 交换。
11 复杂性:恒定时间.
如果使用运算符动态分配数组,则可以在恒定时间内“交换数组”new
。在这种情况下,您确实只能交换指向数组第一个元素的指针。
例如:
#include <iostream>
#include <algorithm>
int main() {
int **a = new int *[2];
a[0] = new int[5] { 0, 1, 2, 3, 4 };
a[1] = new int[5] { 5, 6, 7, 8, 9 };
for ( size_t i = 0; i < 2; i++ ) {
for ( size_t j = 0; j < 5; j++ ) {
std::cout << a[i][j] << ' ';
}
std::cout << std::endl;
}
std::cout << std::endl;
std::swap( a[0], a[1] );
for ( size_t i = 0; i < 2; i++ ) {
for ( size_t j = 0; j < 5; j++ ) {
std::cout << a[i][j] << ' ';
}
std::cout << std::endl;
}
std::cout << std::endl;
delete [] a[0];
delete [] a[1];
delete [] a;
return 0;
}
输出是:
0 1 2 3 4
5 6 7 8 9
5 6 7 8 9
0 1 2 3 4
事实上,同样的操作是在std::vector
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)