我说这个代码会在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;
}
}
答案 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)运行。