C++ O(N^2)是否为循环嵌套为O(N),而循环是可能的?
我说这段代码将在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) { ++
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是一个与你的程序相关的计数,那么它是什么?这是有意义的。非常感谢。