我们如何可以换2个阵列在不断的复杂性或O(1)?(How can we swap 2 arrays

2019-10-21 03:25发布

我们如何可以换2个阵列在不断的复杂性或O(1)? 有没有办法,我们可以做到这一点? 我已经使用指针尝试,但它给错误

加上这不会帮助,因为它只是交换了指针,但是没有阵列

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

我一直在使用矢量赋值运算符和尝试,但他们有线性复杂度,即O(N)不恒定那么有没有什么办法,我们可以在O交换两个阵列(1)? (使用指针或别的东西)

I HV试穿网上搜索发现codeforces的链接( http://codeforces.com/blog/entry/11971 ),但这并没有帮助。

Answer 1:

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

从C ++标准

空隙交换(矢量&X);

10种效果:交流的内容,并与x的这个的*容量()。

11复杂度: 常量时间

你可以“交换阵列”用一定的时间,如果他们被动态地运营商新的分配。 在这种情况下,你确实可以只换指向数组的第一个元素的指针。

例如

#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 

事实上,同样的操作在做性病:: vector的。



文章来源: How can we swap 2 arrays in constant complexity or O(1)?