【问题标题】:C++ "[ ]" operatorC++“[]”运算符
【发布时间】:2021-09-02 06:03:39
【问题描述】:

我最近阅读了this 问题,并在搜索了一下我found 用于向量(任何更多容器)[ ] c++ 中的运算符 实际上返回参考,因此返回 O(1) 复杂度,只是 above 它,提到 = 运算符具有线性时间复杂度,所以我的问题是我是否有一个多维向量 v 并且我执行类似的操作:

v[i]=v[j];

它将是恒定时间操作还是线性时间,为什么?在某处我读过它是 O(1),但我不确定。

This 是讨论算法的博客,在此评论的第二行中,用户说它是 O(1)(这里 v 是多维向量/向量数组),它是这个算法,如果不是,我认为算法不会具有相同的复杂度,

谢谢!

【问题讨论】:

  • std::vector::operator= 花费线性时间。
  • @Old Man 您需要将向量 v[j] 的所有元素复制到向量 v[i] 中。复杂性是什么?
  • @VladfromMoscow 这将是线性的。
  • @OldMan 所以你刚刚回答了你自己的问题;)
  • 当你说某事是O(f(n)) 时,你说的是哪个n 很重要。如果你有vector<vector<T>> v; vector<T> x;v[i] = xv 的大小上是常数,在x 的大小上是线性的。

标签: c++ time-complexity operators


【解决方案1】:

整个 std::vector<T> 的复制是 O(N),因为每个元素 T 都需要被复制。

C++ 标准要求std::vector<T>::operator[] 的所有重载都具有恒定的复杂性。通常它是在std::vector中的数据上使用指针算法来实现的。

所以,v[i] = v[j]; 是 O(1)。

T 可以是任意多维的事实在这里并不重要。向量副本是 O(N),因为如果将元素数量增加一倍,那么时间就会增加一倍(无论如何都有一定的限制)。向量 element 的副本是 O(1),因为它不依赖于向量中的元素数量。

【讨论】:

  • 但是如果T 也是std::vector,那么它将再次是O(N) ;) 但是这个N 与这个“内部”向量的长度有关,而不是与“外部”有关向量。
  • @Bathsheba 你的 v 和我的一样吗?多维?
  • @OldMan,请按以下方式查看。 = 对于固定大小的对象是 O(1),但对于可变大小的对象是 O(N)。所以,如果我们有std::vector<T> 其中T 是固定大小类型,那么v[i] = v[j] 是O(1),但是如果T 是可变大小类型,比如std::vector,那么v[i] = v[j] 是O(N )。
  • @sklott -- 执行v[i] = v[j] 的时间不取决于v 的大小。这使它成为恒定的时间。如果您将v 的大小加倍,则完成作业的时间保持不变。是的,复制元素所需的时间可能会有所不同,但这是元素的属性,而不是容器的属性。
  • @OldMan:是的,您似乎确实处于困境中。对于整个容器,分配是 O(1)。向量有效载荷是什么并不重要。皮特贝克尔清楚地说明了这一点。
猜你喜欢
  • 2012-11-26
  • 2013-10-23
  • 2011-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多