【问题标题】:Complexity of swapping two rows in vector and array using swap function使用交换函数交换向量和数组中两行的复杂性
【发布时间】:2016-12-03 14:31:24
【问题描述】:

在 2D 向量和 2D 数组中交换两行的复杂度是多少,我测试了两者的时间复杂度,似乎在向量中交换几乎是O(1),但在数组中的工作速度较慢,那么真正的复杂性是什么,为什么不同的?

在数组中(非常慢):

int arr[N][N];
// input the array elements
while (q--) { // number of queires
    int x, y;
    scanf("%d %d", &x, &y);
    swap(arr[x], arr[y]);
}

在向量中使用上面相同的代码,但我不使用int arr[N][N],而是使用vector<<vector>>

【问题讨论】:

  • 我认为您混淆了复杂性和实验结果的概念 - 测试它们时哪个更快?
  • 当我运行这两个代码时,向量运行得更快,我的意思是就输出结果而言。
  • 顺便说一句,希望你不要在实际代码中使用那些scanf 调用。
  • @ChristianHackl 为什么?

标签: c++ vector stl time-complexity swap


【解决方案1】:

std::swap 使用move semantics 优化std::vectors 的交换。本质上,它归结为在两个std::vectors 之间交换一些内部指针。向量中有多少值无关紧要。这是一个指针交换,或多或少。恒定时间。

原生数组没有这样的快捷方式。数组中的所有值都必须乖乖复制。

移动语义是 C++11 的主要补充之一。

为了澄清,简而言之,std::vector 是一个如下所示的类:

template<typename T>
class vector {

    T *data;
    size_t data_size;
};

除此之外还有很多其他内容,但这说明了重点:std::swap 需要做的就是在两个向量和你去吧:向量的内容已被交换。不需要实际的数据复制。

【讨论】:

  • 好点,我有一个问题。我们可以看到交换数组和向量的复杂性,我们知道。但是,数组看起来如何,我的意思是,为什么数组看起来与向量不同?只分配一次?我知道它是不同的,为什么不能这样呢?例如数据 = 新 T[N];给数组分配一次不就好了吗?
  • 这就是智能指针的用途。为正确的工作使用正确的工具。
  • 我知道智能指针。问题是“为什么数组不能和向量一样,只分配一次?”,所以 swap 可以用同样的方式交换指针。
  • 因为如果“一个数组看起来与向量相同”,那么当人们可以简单地使用向量时,就没有任何理由首先拥有一个数组。有数组和向量的原因是有原因的。它们不一样。它们有不同的属性。数组在某些方面做得更好。向量在其他方面做得更好。如果它们不是,如果它们完全一样,那么这将是一个非常愚蠢的情况,因为其中一个将是完全多余的。这就像在问为什么我们同时拥有火车和公共汽车,以及为什么我们不能像公共汽车一样让火车在道路上行驶。
  • 哦,不。我知道它们不同,因为它们不同。问题是关于“交换”。问题是“为什么数组不能看起来与向量相同(就交换优化而言),只分配一次?”,所以“交换”可以以相同的方式交换指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多