【问题标题】:Fastest way to populate a boost::dynamic_bitset<> from a vector of strings从字符串向量填充 boost::dynamic_bitset<> 的最快方法
【发布时间】:2018-12-02 23:13:23
【问题描述】:

我正在实现一个使用霍夫曼编码压缩文件的程序。我无法将压缩字符串的位写入另一个位集。我有一个字节向量(8 位整数)和一个字符串向量 huffCodes,它的大小为 256,用于存储每个索引的位字符串。 (比如0用11表示,1用11011表示等等。)

这是我目前的方法:

string compressed = "";
boost::dynamic_bitset<unsigned char> output;

for(byte b : bytes) 
{
    compressed += huffCodes [ ByteToInt(std::to_string(b)) ];
}

output = boost::dynamic_bitset<unsigned char> (compressed);

这会遍历每个字节并从 huffCodes 向量中获取其对应的位串,然后将该字符串附加到压缩字符串中。压缩字符串完成后,会将其转换为位集。这种方法的问题在于它非常缓慢地填充位集,因为我的向量中有 7200 万字节。不过我不喜欢这种方法,因为似乎没有必要填充这个巨大的字符串来将其转换为位集。我更喜欢这样的东西:

boost::dynamic_bitset<unsigned char> output;
string temp = "";
    for(byte b : bytes) 
    {
        temp = huffCodes [ ByteToInt(std::to_string(b)) ];
        output.append(temp);
    }

显然这不是真正的代码,但理想情况下,我会在从 huffCodes 向量中收集所有字符串的同时填充输出位集。是否可以通过某种连接或将字符串附加到位集来做到这一点?

注意:huffCodes 向量的内容是长度为 8 的字符串,仅由 1 和 0 组成

【问题讨论】:

    标签: c++ boost-dynamic-bitset


    【解决方案1】:

    你的瓶颈几乎肯定是这一行:

    compressed += huffCodes [ ByteToInt(std::to_string(b)) ];
    

    因为在您循环循环时,输出字符串 (compressed) 将被重新分配和复制多次。

    请尝试以下操作,而不是这样做。请注意,这会预先分配适当大小的向量,以避免需要进行昂贵的重新分配和复制。我也认为不需要将 b 转换为字符串,然后再转换回 int,因此我将其删除:

    std::string s;
    int nbytes = 0;
    for (b : bytes)
        nbytes += huffcodes [b].size ();
    
    {
        std::vector <char> v (nbytes + 1);
        for (b : bytes)
        {
            auto hc = huffcodes [b];
            for (auto c : hc)
                v.push_back (c);
        }
    
        v.push_back (0);    // NUL terminator
        s = v.data ();
    }
    
    auto output = boost::dynamic_bitset<unsigned char> (s);
    

    如您所见,转换为字符串是在单个操作中完成的。不得不复制这么大的数据结构很可惜,但似乎没有其他办法。

    【讨论】:

    • 谢谢,我一回家就试试这个。但是,有没有办法完全绕过字符串?由于我无论如何都在读取每个字节,因此必须有某种方法可以将它们直接放入输出 bitset 否?
    • 我看不到,不,除非您将 bitset 替换为您自己的类。
    • 修改代码以显示转换为字符串
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2015-08-27
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多