【发布时间】:2018-05-17 15:31:33
【问题描述】:
假设我有一个包含n 字符串的向量,其中字符串的长度可以是 5...n。每个字符串必须逐个字符地与每个字符串进行比较。如果不匹配,则分数增加一。如果有匹配,则分数不会增加。然后我会将得到的分数存储在一个矩阵中。
我通过以下方式实现了这一点:
for (auto i = 0u; i < vector.size(); ++i)
{
// vector.size() x vector.size() matrix
std::string first = vector[i]; //horrible naming convention
for (auto j = 0u; j < vector.size(); ++j)
{
std::string next = vector[j];
int score = 0;
for (auto k = 0u; k < sizeOfStrings; ++k)
{
if(first[k] == second[k])
{
score += 0;
}
else
{
score += 1;
}
}
//store score into matrix
}
}
我对这个解决方案不满意,因为它是O(n^3)。所以我一直在想其他方法来提高效率。我曾考虑编写另一个函数来替换我们的 j for 循环的内部结构,但是,它仍然是 O(n^3),因为该函数仍然需要一个 k 循环。
我也考虑过队列,因为与string[1] 到string[n] 相比,我只关心string[0]。 String[1] 与 string[2] 与 string[n] 相比。 String[2] 与 string[3] 到 string[n] 相比,等等。所以我的解决方案有不必要的计算,因为每个字符串都在与其他字符串进行比较。这个问题是我不确定如何从中构建我的矩阵。
我终于查看了 std 模板库,但是 std::mismatch 似乎不是我想要的,或者 std::find。大家还有什么想法?
【问题讨论】:
-
如果性能是问题,那么我建议首先确保您当前的算法有机会表现良好,即使用引用而不是到处复制字符串:
std::string& next = vector[j]; -
@keith,我目前在一个函数中通过引用传递向量,但我不认为通过引用传递字符串。我只是想摆脱
O(n^3)的比较。这似乎是一个经典的动态编程问题。 -
(1) :将字符串向量转换为矩阵 m,其中 m[n] 是在字符串中位置 #n 找到的每个字符的 #occurence 列表:
{"aaa"},{"abb"},{"abc"}-> @ 987654341@. -
(2)意识到总分是每个
m[n]的分数之和。 -
(4) 享受.......
标签: c++ algorithm performance time-complexity