C++ 对使用斐波那契码编码的字符串进行解码的最佳方法

C++ 对使用斐波那契码编码的字符串进行解码的最佳方法,c++,performance,fibonacci,C++,Performance,Fibonacci,我已经写了一个编码器和解码器,利用斐波那契码 出于我的目的,我能够编写一个解码函数,但它本质上是描述性的。 我在这里寻找性能更好且不会在过程中破坏输入字符串的替代方案 结构符号 { 字符串代码; 无符号字符符号; }; /*从compfile1.txt解压缩消息*/ void decompressMsg(常量向量和代码符号,字符串s){ 尺寸和位置; 字符串delim=“11”; 字符串dcStr; 向量brokenStr; //使用分隔符分解压缩字符串 while((pos=s.find(de

我已经写了一个编码器和解码器,利用斐波那契码

出于我的目的,我能够编写一个解码函数,但它本质上是描述性的。 我在这里寻找性能更好且不会在过程中破坏输入字符串的替代方案

结构符号 { 字符串代码; 无符号字符符号; }; /*从compfile1.txt解压缩消息*/ void decompressMsg(常量向量和代码符号,字符串s){ 尺寸和位置; 字符串delim=“11”; 字符串dcStr; 向量brokenStr; //使用分隔符分解压缩字符串 while((pos=s.find(delim))!=std::string::npos){ brokenStr.push_back(s.substr(0,pos+delim.length()); s、 擦除(0,pos+delim.length()); } //将压缩字符串的分解部分与fib代码匹配 用于(自动&tk:brokenStr){ 用于(自动和符号:编码符号){ if(tk==sym.fibCode) dcStr+=sym.symbol; } } //打印解压缩的消息
cout明显的问题是
s.erase(0,

这需要将
s
的尾部复制到新的前端。一般来说,这会使其成为O(n*n)

相反,您可以创建一个新变量
size\u t processed
,该变量跟踪已处理的
s
部分。在
s.find(delim)
中,您可以添加
processed
作为搜索的开始位置。显然,您还需要更新
substr


另外,您可以使用<代码> STDI:StutyXVIEW <代码> BROKESTR 。不需要复制子串。< /P>选择一种语言。<代码> vector <代码>是C++,但是您正在编写“代码> char * FiBeNebug < /Calp>和<代码>新char []。。只要始终如一地使用

std::string
。而且,您的代码似乎不完整(
fibcodencing
)我也不清楚问题和代码之间的关系。我正在尝试优化解压缩功能。目前,它使用strtok并吃掉输入字符串。主要关注的是
void decompressMsg(const vector&CodedSymbols,string s)
和其他人在那里填补空白或回答与所使用的各种数据结构相关的问题。我在
decompressMsg
中没有看到
strtok
CodedSymbols
const
,这样就不会被占用,
s
是按值传递的。如果您能添加一个有效输入的示例,这将非常好代码速度慢(通常调用
decompressMsg
)。您的输入、预期输出和实际输出是什么?
/* decompress message from compfile1.txt */
void decompressMsg(const vector<symbol> &CodedSymbols, string s) {
    size_t pos;
    string delim = "11";
    string dcStr;
    size_t processed;
    vector<string> brokenStr;

    // break down compressed string using delimiter
    processed = 0;
    while ((pos = s.find(delim,processed)) != std::string::npos)
    {
        brokenStr.push_back(s.substr(processed, pos + delim.length() - processed));
        processed = pos + delim.length();
    }

    // match broken down parts of compressed string to fib codes
    for (auto &tk : brokenStr) {
        for (auto &sym : CodedSymbols) {
            if (tk == sym.fibCode)
                dcStr += sym.symbol;
        }
    }

    // print decompressed message
    cout << "Decompressed message = " << dcStr << endl;
}