繁体   English   中英

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

[英]What is the complexity of copying a variable in C++

我的一个朋友说,位掩码比位集更好,因为复制位集需要O(N)时间,而复制位掩码只需要O(1)时间,因此对于动态编程等应用程序来说,它要快得多。 所以我想知道所有其他数据类型是否相同?

例如,此代码块的复杂性是什么?

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

如果是O(N),为什么会这样呢? 不应该像做某件事一样是O(1)

int x = 530210;
int y = x;

将会?

您有vec1 ,这是此卡车代表的std::vector<T> ,其拖车上连接了黑色容器

在此处输入图片说明

(来源:bigcommerce.com)

现在,它的黑色容器中有数百万篇论文(由black-container提供std::vector<T>对元素的存储)。 现在,您想将纸张复印到另一个类似的载体vec2 你怎么能做到最好? 影印的复杂度是多少? 将会是O(论文数量)


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

要了解操作的复杂性,首先必须定义您的计算模型。 特别是,您必须定义哪些操作是O(1)以及哪些操作是免费的。

例如,如果您正在查看需要大量硬盘访问的程序,则只会考虑从磁盘读取一个块作为一项操作,而对内存的访问则是免费的。

在位掩码和位集的示例中,您可能正在计算内存块复制操作。 然后,复制适合一个内存块的位掩码仅花费一份内存副本。 但是,在此模型中,复制位掩码仍然为O(N),因为大的位掩码将跨越许多存储块。 更准确地说,如果b是一个内存块中的位数,而N是位掩码中的位数,那么您需要ceil(N / b)存储块复制操作来复制位掩码。

复制长度为N的向量的方法有几种:

  • O(1)向量复制操作
  • O(N)元素复制操作
  • 如果元素复制操作为O(T) ,则为O(NT)个度量单位

顺便说一句,您的朋友关于bitset是错误的,否则您会误解。 的优点bitset是数据结构被优化以利用并行执行的低水平的形式,可以由单个线程来完成的优点-即64位整数运算可以用来在64个不同的位同时工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM