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