【问题标题】:How can we swap 2 arrays in constant complexity or O(1)?我们如何以恒定复杂度或 O(1) 交换 2 个数组?
【发布时间】:2014-10-11 08:14:35
【问题描述】:

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

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

#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),但这没有帮助。

【问题讨论】:

  • std::vector 即使在 C++03 中,交换也必须为 O(1)。数组交换本质上是O(N)。

标签: c++ arrays pointers stl swap


【解决方案1】:

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

来自 C++ 标准

无效交换(向量& x);

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

11 复杂性:恒定时间。

如果它们是用 operator 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 中也进行了相同的操作。

【讨论】:

  • 对于堆栈上的静态分配数组或虚拟内存的数据部分无法执行此操作的原因是什么?玩对堆栈分配内存的引用似乎很危险,但至少应该是可能的吗?毕竟它们也是内存地址。
猜你喜欢
  • 1970-01-01
  • 2021-03-28
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2013-07-25
  • 2018-05-13
  • 1970-01-01
相关资源
最近更新 更多