降低在 C++ 中比较单个字符串中的两个字符的时间复杂度 [关闭]

Posted

技术标签:

【中文标题】降低在 C++ 中比较单个字符串中的两个字符的时间复杂度 [关闭]【英文标题】:reducing time complexity of compare two characters in one single string in c++ [closed] 【发布时间】:2021-09-14 07:51:01 【问题描述】:

我必须将字符串的第一个字母与 C++ 中字符串的其他字母进行比较 例如:在“bsadasdaddgkoj”中 我必须将 b 即第一个字母与所有其他字母进行比较,看看它是否按字母顺序更小 但我必须非常快地做到这一点

vector<string> possibleChanges(vector<string> usernames) 
int n=usernames.size();
 vector<string> answers(n);
 for(int i=0;i<n;i++) 
     for(int j=1;j<usernames[i].size();j++) 
        if(usernames[i][0] > usernames[i][j])
            answers[i] = "YES";
            break;
        
    
    if(answers[i]!="YES") answers[i]="NO";
 
 return answers;

到目前为止,我已经尝试过了,但它确实很慢。

【问题讨论】:

有什么理由使用std::string 而不是bool 你通过复制传递你的std::vector...改用 const 引用。 您是否启用了编译器优化? “真的很慢”有多慢? 如果您使用std::vector&lt;bool&gt; 作为答案,您可以使用向量轻松检查代码,打印"YES""NO"。然后您可以将向量初始化为全部为假,并且仅在usernames[i][0] &gt; usernames[i][j 检查中设置为真。并删除所示代码中的第二个if。为了获得更高的运行时效率,您可以使用std::vector&lt;int&gt; 作为答案。 我很确定瓶颈不在比较中,而是在您的额外副本和/或字符串使用中。你分析过你的代码吗? 【参考方案1】:

假设您确实需要字符串形式的答案...

vector<string> possibleChanges(const vector<string>& usernames) 
 const size_t n = usernames.size();
 vector<string> answers(n, "NO");
 for (size_t i = 0; i < n; ++i) 
    auto firstChar = usernames[i][0];
    auto it = std::find_if(usernames[i].begin() + 1, usernames[i].end(), [&firstChar](std::string::value_type ch)  return firstChar > ch; );
    if (it != usernames[i].end())
       answers[i] = "YES";
 
 return answers;

另外,如果您知道 usernames[i].size() >= 2(或 4,或 8...),您可以像这样应用循环展开:

for (size_t i = 0; i < n; ++i) 
         auto firstChar = usernames[i][0];
         size_t j = 1;
         bool flag = false;
         for (; j + 4 < usernames[i].size(); j += 4) 
            if (firstChar > usernames[i][j] ||
               firstChar > usernames[i][j + 1] ||
               firstChar > usernames[i][j + 2] ||
               firstChar > usernames[i][j + 3]) 
            
               answers[i] = "YES";
               flag = true;
               break;
            
               
         
         for (; j < usernames[i].size() && !flag; ++j) 
            if (firstChar > usernames[i][j]) 
               answers[i] = "YES";
               break;
            
         

【讨论】:

工作但仍然很慢 循环展开会帮助你 更新循环展开...

以上是关于降低在 C++ 中比较单个字符串中的两个字符的时间复杂度 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 中的 getline 函数中提取特定的子字符串?

一个时钟周期内的 C++ 字符串比较

如何仅针对键的子集有效地比较 C++ 中的两个字符串映射

如何在 C++ 中将文件中的段落作为单个字符串读取

在 C++ 中比较来自向量的字符串时出现分段错误

C++中两个字符串的比较