【发布时间】:2016-05-02 11:58:26
【问题描述】:
我正在编写一个 C++ 算法,它接受两个字符串,如果您可以通过将单个字符更改为另一个字符来从字符串 a 变为字符串 b,则返回 true。 两个字符串的大小必须相等,并且只能有一个差异。 我还需要访问已更改的索引以及已更改的 strA 字符。 我找到了一个可行的算法,但它会遍历每一对单词,并且在任何大量输入时运行速度都太慢了。
bool canChange(std::string const& strA, std::string const& strB, char& letter)
{
int dif = 0;
int position = 0;
int currentSize = (int)strA.size();
if(currentSize != (int)strB.size())
{
return false;
}
for(int i = 0; i < currentSize; ++i)
{
if(strA[i] != strB[i])
{
dif++;
position = i;
if(dif > 1)
{
return false;
}
}
}
if(dif == 1)
{
letter = strA[position];
return true;
}
else return false;
}
关于优化的任何建议?
【问题讨论】:
-
您有什么样的优化方案?时间?记忆?顺便说一句,您还没有解决已更改字符的索引,您只是返回字符本身
-
我可以看到
canChange()(那个名字很有趣)检查字符对 - 你能详细说明every single pair of words吗? -
我认为“遍历每一对单词”是缓慢的根源;发布的代码看起来非常有效。如果您将文本 1 中的每个单词与文本 2 中的每个单词进行比较,这是一个 O(N^2) 操作,无论您优化 canChange() 多少,它都会很慢。
-
太慢了有多慢?你使用了哪些编译选项,你的微基准是什么样的?你在什么硬件上运行它?英特尔哈斯韦尔?英特尔酷睿2?微基准测试对于现代 CPU 来说是困难,这要归功于缓存、分支预测和不知道何时不优化掉重复相同工作的循环的编译器。在没有优化启用的情况下编译是不是一个选项,尤其是。不适用于需要大量内联包装函数才能生成可接受的 asm 的普通 C++。
-
很遗憾,您的代码不能使用 gcc 或 clang 自动矢量化。它编译成一个相当紧凑的循环,每次迭代检查一个字节。 goo.gl/AAEA3A(从
.L4到jg .L4的循环)。它在通常采用的循环内有一个条件分支。
标签: c++ string algorithm optimization char