C++ 在C+;中复制变量的复杂性是什么+;

C++ 在C+;中复制变量的复杂性是什么+;,c++,time-complexity,C++,Time Complexity,我的一位朋友说,位掩码比位集好,因为复制一个位集需要O(N)个时间,而复制一个位掩码只需要O(1)个时间,这使得它在动态编程等应用程序中的速度要快得多。所以我想知道其他所有数据类型都是一样的吗 例如,这段代码的复杂性是多少 vector <int> vec1 = {1,2,3,4,5,6,7,8,9,10}; vector <int> vec2 = vec1; 将是?您有vec1,它是一个std::vector,由这辆卡车表示,拖车上连接了一个黑色集装箱 (来源:bi

我的一位朋友说,位掩码比位集好,因为复制一个位集需要O(N)个时间,而复制一个位掩码只需要O(1)个时间,这使得它在动态编程等应用程序中的速度要快得多。所以我想知道其他所有数据类型都是一样的吗

例如,这段代码的复杂性是多少

vector <int> vec1 = {1,2,3,4,5,6,7,8,9,10};
vector <int> vec2 = vec1;

将是?

您有
vec1
,它是一个
std::vector
,由这辆卡车表示,拖车上连接了一个黑色集装箱

(来源:bigcommerce.com)

现在,它的黑色容器中有数百万张纸(按黑色容器,
std::vector
的元素内存)。现在,您要将这些文件影印到另一个类似的车辆上,
vec2
。你怎样才能做到最好?照片复制的复杂性是什么?它将是O(论文数量)



现在,假设您想移动内容。。。所有的
std::vector
需要做的就是将其黑色容器从卡车上拆下,并将其连接到另一辆卡车的。。。这使得移动集装箱的复杂性为O(1)

您有
vec1
,它是一个
std::vector
,由这辆卡车表示,拖车上连接了一个黑色集装箱

(来源:bigcommerce.com)

现在,它的黑色容器中有数百万张纸(按黑色容器,
std::vector
的元素内存)。现在,您要将这些文件影印到另一个类似的车辆上,
vec2
。你怎样才能做到最好?照片复制的复杂性是什么?它将是O(论文数量)



现在,假设您想移动内容。。。所有的
std::vector
需要做的就是将其黑色容器从卡车上拆下,并将其连接到另一辆卡车的。。。这使得移动容器的复杂性为O(1)

要理解操作的复杂性,首先必须定义计算模型。特别是,你必须定义O(1)是什么操作,以及你认为哪些操作是免费的。p>

例如,如果你正在查看需要大量硬盘访问的程序,你只需要考虑从磁盘读取一个块作为一个操作和内存访问是免费的。p>


在位掩码和位集合的示例中,您可能正在计算内存块复制操作。然后,复制一个适合一个内存块的位掩码只需要一个内存拷贝。然而,在这个模型中,复制位掩码仍然是O(N),因为一个大的位掩码将跨越许多内存块。更准确地说,如果b是一个内存块中的位数,N是位掩码中的位数,则需要ceil(N/b)内存块复制操作来复制位掩码

要理解操作的复杂性,首先必须定义计算模型。特别是,你必须定义O(1)是什么操作,以及你认为哪些操作是免费的。p>

例如,如果你正在查看需要大量硬盘访问的程序,你只需要考虑从磁盘读取一个块作为一个操作和内存访问是免费的。p>


在位掩码和位集合的示例中,您可能正在计算内存块复制操作。然后,复制一个适合一个内存块的位掩码只需要一个内存拷贝。然而,在这个模型中,复制位掩码仍然是O(N),因为一个大的位掩码将跨越许多内存块。更准确地说,如果b是一个内存块中的位数,N是位掩码中的位数,则需要ceil(N/b)内存块复制操作来复制位掩码

复制长度为
N
的向量可以通过几种方式进行测量:

  • O(1)
    矢量复制操作
  • O(N)
    元素复制操作
  • O(NT)
    如果元素复制操作是
    O(T)

顺便说一句,您的朋友对
位集的看法是错误的,或者您误解了。
位集
的优点是,数据结构经过优化,以利用可由单个线程完成的低级并行执行形式,即64位整数操作可用于同时处理64个不同的位。

复制长度为
N
的向量可通过以下几种方式进行测量:

  • O(1)
    矢量复制操作
  • O(N)
    元素复制操作
  • O(NT)
    如果元素复制操作是
    O(T)

顺便说一句,您的朋友对
位集的看法是错误的,或者您误解了。
位集
的优点是,数据结构经过优化,可以利用一个线程可以完成的低级并行执行形式,即64位整数操作可以用于同时处理64个不同的位。

复制每个元素,因此它是O(n)。如果vec2是一个引用,那么它将是O(1)(但它不会是一个副本)。int拷贝是O(1),因为int具有恒定的大小。一个AP int应该是O(n)。简单的提示等待一个更好的答案:如果向量有,100个元素,性能是否相同?还是1000?还是100万?大概这就是为什么N。复制向量的N个元素的简单方法是一个有N个赋值的循环。因此O(N)。但是,还有其他方法(例如复制较大的内存块),但对于所有可能的元素类型(例如向量的元素是具有非平凡构造函数/析构函数的对象)都不起作用(未定义的行为)。理论上,复制位集和位掩码也是O(N)。只有乘法常数很小,因为硬件中的每个字都包含许多位(比如32或64位),可以在一次操作中复制。如果要编写一个类似向量的类并实现一个复制操作,如何
int x = 530210;
int y = x;