O(N ^ 2)是否可以循环嵌套为O(N),而循环可能?

时间:2017-09-06 17:38:23

标签: c++ algorithm

我说这个代码会在O(N)时间执行吗?这是迭代地图< int,vector< int>取代。

  int counter = 0;
  unsigned int u = 0;
  unsigned int v = 0;
  bool notDone = true;
  while (notDone) {
    if (u < map.size()) {
      if (v < map.at(u).size()) {
        if (map.at(u)[v] == -1) {
          ++v;
        }
        else {
          ++counter;
          ++v;
        }
      }
      else {
        v = 0;
        ++u;
      }
    } else {
      notDone = false;
    }
  }

3 个答案:

答案 0 :(得分:5)

如果N是地图条目的数量,并且TV是所有向量的大小的总和,则无论是否将其写为&#34;您的程序都是m_TypeToConcrete[underlyingType].GetEnumerable().CastAs<T>(); 。或嵌套&#34; for&#34;。

如果N是地图条目的数量而MV是所有向量的大小的平均值,则无论是否将其编写为&#34;您的程序都是O(N + TV)。或嵌套&#34; for&#34;。

更新:评论员蒂姆注意到O(N * MV)的大小与map.at相同,并且被称为O(lg N)次,因此会产生实际的复杂性O(N)和分别为O(N * lg N + TV)。谢谢!

我对C ++标准库的了解不足以说明是否有更有效的方法;我怀疑在地图上存在一个O(1)迭代器。如果确实如此,那么您可以使用它而不是索引来迭代地图,O(N * lg N * MV)项将再次消失。

答案 1 :(得分:2)

你在评论中说,

  

我有一个矢量地图,我想循环遍历地图中的每个元素和矢量的每个元素,但我试图在O(N)时间内完成它。

这是不可能的。

如果地图中有M个元素,每个向量中有N个元素,则所有M * N个元素都在一起。你无法在O(N)时间内迭代它们。

答案 2 :(得分:1)

迭代长度为N的地图,并在每个循环中迭代长度为M的向量。假设所有向量的长度相同,则算法将以O(N * M)运行。