我们如何以恒定复杂度或 O(1) 交换 2 个数组?

nam*_*man 1 c++ arrays swap pointers stl

我们如何以恒定复杂度或 O(1) 交换 2 个数组?有没有办法做到这一点?我试过使用指针,但它给出了错误

加上这无济于事,因为它只是交换指针而不是数组

#include <algorithm>
int AA[100], *A=AA, BB[100], *B=BB;
swap(A, B);
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用向量赋值运算符,但它们具有线性复杂性,即 O(N) 不是常数,所以有什么方法可以在 O(1) 中交换两个数组?(通过使用指针或其他东西)

我尝试在网上搜索找到了 codeforces 的链接(http://codeforces.com/blog/entry/11971),但这没有帮助。

Vla*_*cow 5

std::swap对向量 ( std::vector)使用(使用成员函数交换)具有 O(1) 的复杂度。

来自 C++ 标准

无效交换(向量和x);

10 效果:将 *this 的内容和容量()与 x 的内容和容量()交换。

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;
}
Run Code Online (Sandbox Code Playgroud)

输出是

0 1 2 3 4 
5 6 7 8 9 

5 6 7 8 9 
0 1 2 3 4 
Run Code Online (Sandbox Code Playgroud)

事实上,同样的操作在 std::vector 中完成。