如何从 C++ 中 O(n) 的关联 NxN 矩阵中删除行和列?
How to delete rows and columns from an associative NxN matrix in O(n) in C++?
我有一个关联的 NxN 矩阵和一个包含所有列的向量:
std::map<std::string,std::map<std::string,int>> A;
std::vector<std::string> columns; //this has size n
一个元素看起来像这样:A["abc"]["bcd"] = 2
我想在 O(n)
中删除“abc”行(基本上 A["abc"]
)和“abc”列(基本上 A[*]["abc"]
)
A.erase("abc"); //this is O(log n)
for (int i = 0; i < words.size(); ++i) //this is O(n*log n)
{
A[words[i]].erase("abc");
}
这有 O(n*log n) 运行时间。是否可以在 O(n) 中完成?
您可以使用 std::map<std::pair<std::string, std::string>, int>
,其中字符串对是行值和列值。
然后您可以使用适用于 std::map
的自定义 std::erase_if
算法,该算法在 O(n)
时间内运行:
std::erase_if(A, [](const auto& item) {
auto const& [key, value] = item;
return key.first == "abc" or key.second == "abc";
});
我有一个关联的 NxN 矩阵和一个包含所有列的向量:
std::map<std::string,std::map<std::string,int>> A;
std::vector<std::string> columns; //this has size n
一个元素看起来像这样:A["abc"]["bcd"] = 2
我想在 O(n)
中删除“abc”行(基本上A["abc"]
)和“abc”列(基本上 A[*]["abc"]
)
A.erase("abc"); //this is O(log n)
for (int i = 0; i < words.size(); ++i) //this is O(n*log n)
{
A[words[i]].erase("abc");
}
这有 O(n*log n) 运行时间。是否可以在 O(n) 中完成?
您可以使用 std::map<std::pair<std::string, std::string>, int>
,其中字符串对是行值和列值。
然后您可以使用适用于 std::map
的自定义 std::erase_if
算法,该算法在 O(n)
时间内运行:
std::erase_if(A, [](const auto& item) {
auto const& [key, value] = item;
return key.first == "abc" or key.second == "abc";
});