C++如何加快算法-使用字符串

C++ how to faster algorithm - working with strings

本文关键字:字符串 算法 何加快 C++      更新时间:2023-10-16

我正在制作一个使两个二进制数相加的程序。一切都很好,一切都正常,但我需要一些如何加快算法的技巧。

我正在考虑将所有变量更改为动态分配的变量。这是个好主意吗?使所有变量都是动态的,即使我只使用一个或只使用长字符串?

我需要关于如何使用动态分配变量的建议。

这是我的检查功能示例之一:

bool Correct(string v1, string v2){
 for (unsigned int i = 0; i < v1.size(); ++i) {
            if ((cin.fail())||((v1[i] != '1')&&(v1[i] != '0')))
                return false;
                }
for (unsigned int i = 0; i < v2.size(); ++i) {
            if ((cin.fail())||((v2[i] != '1')&&(v2[i] != '0')))
                return false;
                }
    return true;
}

当我使用这个:

bool JsouVstupySpravne(string *v1, string *v2){...}

所有像v1.size()这样的用法都停止工作。

您可以为开始提供输入参数的引用:

bool Correct(string v1, string v2){

可以是

bool Correct(const string &v1, const string &v2){

当使用指向字符串的指针而不是字符串时,需要更改

string1.size()  →  string1->size()
string1[x] → (*string1)[x]

因为C++需要的语法不同。

然而,C++也允许您使用"引用",以避免在保留字符串对象语法的情况下进行复制。要做到这一点,您可以更改:

bool Correct(string v1, string v2){ ... }

bool Correct(const string& v1, const string& v2){ ... }

然而,请注意,在今天的计算机中,执行速度取决于许多因素,因此在没有可靠度量的情况下"优化"代码简直是无稽之谈。您需要首先找到时间花在哪里(分析),然后再投资使代码更快(不幸的是,有时会使代码更丑)。

如果您正在寻找有关性能优化的建议,您需要发布负责大部分运行时的代码。你没有说你正在使用哪个操作系统,但应该有一个探查器可以告诉你这一点。在Linux上它是gprof,VC++包括一个。使用它可以找出时间花在哪里,然后优化热点。

最佳性能增益通常通过使用高效的算法来实现,然后对实现进行优化。如何将位字符串转换为数字?霍纳方案在我的脑海中是一种减少乘法运算的有效算法。

代码中有两点值得一提:

  1. 每次调用函数时都会复制字符串,但不会对其进行修改。使用常量引用
  2. 根据片段推测,您似乎使用std::cin将0/1字符转换为数字。这可能不是很有效,因为iostream做的事情在您的情况下可能不需要,例如区域设置处理

最后,如果您可以使用固定长度的二进制字符串和最大64位的大小,那么有一个std::bitset类型可以实现您想要做的事情。

unsigned long long Correct(const string &v1, const string &v2){
    auto const bits1 = std::bitset<64>( v1 );
    auto const bits2 = std::bitset<64>( v2 );
    return bits1.to_ullong() + bits2.to_ullong();
}

如果您需要更长的比特串,boost::dynamic_bitset应该是一个替代方案。