针对自定义数据编码优化位浪费

时间:2019-08-12 18:06:07

标签: algorithm optimization encoding

我想知道什么是一个好的解决方案,以使自定义数据结构占用尽可能少的空间,而且我一直在寻找任何东西。

总体思路是,我可能具有某种数据结构,其中包含许多不同的变量,整数,布尔值等。使用布尔值,使用位掩码/标志相当容易。对于整数,也许我只需要将10个数字用于一个整数,将50个用于另一个整数。我希望有一些功能可以对结构进行编码,而不浪费任何位。理想情况下,我可以将它们并排打包成一个阵列,而无需任何填充。

我有一个模糊的想法,我将不得不枚举所有变量值的所有可能排列方式,但是我不确定从哪里开始。

此外,尽管这可能会更复杂,但是如果我有很多限制,例如如果其他变量满足某些条件,则不关心某些变量,该怎么办?这样可以减少排列的数量,所以这里也应该有一种保存一些位的方法吗?

示例:假设我有一个在线游戏服务器,其中包含许多玩家。每个玩家。玩家结构存储了许多不同的变量,级别,状态和一堆标记,这些标记已清除了玩家的任务。

struct Player {
    int level; //max is 100
    int strength //max is 
    int int // max is 500
    /* ... */
    bool questFlag30;
    bool questFlag31;
    bool questFlag32;
    /* ... */
};

我想拥有一个函数,该函数接受Player个称为encodedData encode(std::vector<Player> players)的向量,以及一个decodeData函数,该函数从编码数据中返回一个向量。

1 个答案:

答案 0 :(得分:1)

这是我想出的;这不是完美的,但它是这样的:

#include <vector>
#include <iostream>
#include <bitset>
#include <assert.h>


/* Data structure for packing multiple variables, without padding */
struct compact_collection {

    std::vector<bool> data;

    /* Returns a uint32_t since we don't want to store the length of each variable */
    uint32_t query_bits(int index, int length) {
        std::bitset<32> temp;
        for (int i = index; i < index + length; i++) temp[i - index] = data[i];
        return temp.to_ulong();
    };

    /* */
    void add_bits(int32_t value, int32_t bits) {
            assert(std::pow(2, bits) >= value);
        auto a = std::bitset<32>(value).to_string();
        for (int i = 32 - bits; i < 32; i++) data.insert(data.begin(), (a[i] == '1'));
    };

};

int main() {
    compact_collection myCollection;
    myCollection.add_bits(45,6);
    std::cout << myCollection.query_bits(0,6);
    std::cin.get();
    return 0;
}