Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ O(N^2)是否为循环嵌套为O(N),而循环是可能的?_C++_Algorithm - Fatal编程技术网

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

C++ O(N^2)是否为循环嵌套为O(N),而循环是可能的?,c++,algorithm,C++,Algorithm,我说这段代码将在O(N)时间内执行,对吗?这是在映射中进行迭代 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) { ++

我说这段代码将在O(N)时间内执行,对吗?这是在映射>中进行迭代

  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;
    }
  }
int计数器=0;
无符号整数u=0;
无符号整数v=0;
bool notDone=true;
虽然(未完成){
如果(u
在您的评论中

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

这是不可能的


如果地图中有M个元素,每个向量中有N个元素,那么总共有M*N个元素。没有办法在O(N)时间内迭代它们。

你迭代长度为N的映射,在每个循环中迭代长度为M的向量。假设所有向量的长度相同,你的算法将在O(N*M)时间内运行。

如果N是映射条目的数量,TV是所有向量大小的总和,那么您的程序就是
O(N+TV)
,不管它是作为“while”还是嵌套的“for”编写的


如果N是映射条目的数量,MV是所有向量大小的平均值,那么您的程序就是
O(N*MV)
,无论它是写为“while”还是嵌套的“for”

更新:评论者Tim注意到,
map.at
O(lgn)
在地图的大小上,它被称为
O(N)
次,因此实际的复杂性分别是
O(N*lgn+TV)
O(N*lgn*MV)
。谢谢


我不知道C++标准库是否有更有效的方法;我怀疑映射上存在O(1)迭代器。如果是这样的话,那么你可以使用它而不是索引来迭代地图,
lgn
项将再次消失。

这取决于它。什么是‘N’?在双for循环中,它是贴图的大小。在while循环中,它是向量中所有元素的大小。Being说,这两种方法实际上都有相同的复杂性。这个问题的标题非常神秘。我不明白这个问题在问什么,但我要指出的是,将变量命名为“notDone”,然后在完成时将其设置为false是非常令人困惑的。将变量命名为
done
,将其设置为
false
,然后在(!done)
时说
。这更容易推理。但更容易推理的是完全删除变量,并用
while(true)
break替换它
。嵌套的
for
循环不一定需要花费O(N^2)来执行。如果是这样,那么将其重新构造为单个
,而
循环并不一定会降低渐进复杂性。您不理解我们在这里问您的问题。当你说“这在O(N)时间内执行”时,N指的是计算某物。N是地图的数量吗?向量的数量?平均向量中的元素数?所有向量中的元素总数?没有O(N)算法,其中N不指任何东西;N是一个与你的程序相关的计数,那么它是什么?这是有意义的。非常感谢。