C ++:适用于此给定方案的数据结构

时间:2013-12-31 18:53:20

标签: c++ data-structures

我想知道在我的情况下哪种数据结构会很好。请指导我。以下是要求。如下图所示,基于三个值A,B和C(其中A将是整数值而B,C将是字符)。左侧表将具有唯一条目。我想存储两个接受规则号和true / false的值。因此,对于A,B和CI的每个唯一值,要存储与它们对应的两个值(接受规则号和真/假)。一个重要的是接受规则号可以是一个或多个(大小不固定)。其次,表长度可达65025或以上。

enter image description here

P.S:我之前曾问过这类问题,但这次情况略有不同。

5 个答案:

答案 0 :(得分:2)

让我们检查一下我们的基础,是吗。

你基本上想要一个三元组(数字,字符,字符)和一个由两个元素组成的对之间的关​​联:一组接受规则号和一个布尔值(注意:在你的例子中,布尔值与那里的事实相关是否接受规则编号。)

因此,我们采用this answer来了解如何最好地选择标准库容器并愚蠢地关注它的问题:

  1. 联想?是
    1. 订购?否=> unordered_
    2. 单独的钥匙?是=> map
    3. 多个值?否(单一结构)=>没有multi
  2. 就是这样,你需要一把unordered_map从你的钥匙(三联体)到你的价值(这一对)。

    对于无序地图,我们需要5个模板参数:

    • Key(关键)
    • T(值)
    • Hash:计算密钥哈希值的谓词,如果正确实现,则默认为std::hash<Key>
    • Equal:一个比较器,用于检查具有相同散列的两个键的幂等性,因为散列不是单射的,它默认为std::equal<Key>(即使用operator==)< / LI>
    • Allocator:容器绘制内存的内存分配器,默认为std::allocator

    因此,假设我们的Key可以进行散列并进行相等性比较,我们只需要提供Key和相关值。虽然很少有钥匙是可以清洗的,所以我们会自己提供这个钥匙。

    struct TableKey {
        int A;
        char B;
        char C;
    };
    
    struct TableKeyHasher {
        size_t operator()(TableKey const& tk) const {
            return hash<int>(tk.A) ^ hash<char>(tk.B) ^ hash<char>(tk.C);
        }
    };
    
    bool operator==(TableKey const& left, TableKey const& right) {
        return std::tie(left.A, left.B, left.C) == std::tie(right.A, right.B, right.C);
    }
    
    bool operator!=(TableKey const& left, TableKey const& right) {
        return not (left == right);
    }
    
    struct TableValue {
        std::unordered_set<int> acceptingRules;
        bool someBooleanWithoutName;
    };
    

    最后:

    using MySuperTable = std::unordered_map<TableKey, TableValue, TableKeyHasher>;
    

答案 1 :(得分:1)

 struct Left{

int A;
char B, C;
int AcceptingIndex; //index of accepting number in the main array

};

}

struct Data{

int *PToAcceptNumber[size];
bool TF[size];

Left LeftValues[leftsize];


};

您有一组数组PToAcceptNumber。如果需要,您可以选择链接列表,这将是一个链接列表数组。左侧值位于结构左侧。每个Left都知道它的接受值,它通过主数组中的索引来识别它。然后每个接受号列表在TF数组中都有一个相应的布尔值。

答案 2 :(得分:1)

据我所知,这就是我解决问题的方法:

B和C保存在char矩阵中,而A可以简单地用作矩阵行的计数器。在一个体积大小的int数组(例如[10])中建立一个结构,你应该保留规则数,并保留一个无符号变量,保持真或假1或0.定义一个类型为该结构和曼尼元素,因为该矩阵中有线条。因此,最后对于char矩阵中的每一行,您将拥有一个包含规则和1或0的结构。

答案 3 :(得分:1)

是。左表的值A,B,C构成右侧表格的键。因此,无论您使用何种数据结构,都将取决于组合密钥。这也意味着无论使用什么值,每次想要查找表时都要遍历键,因此哈希函数可能很有用,其返回值用作结构数据的键

答案 4 :(得分:1)

你的问题很模糊,因为你没有告诉我们你希望支持哪些操作。

如果您的唯一目的是从右表中检索条目,由左表中的条目给出,那么哈希表是一个不错的选项,您需要为右表条目和左表条目定义两个结构。

或者,您也可以考虑TRIE,它将左表构建为前缀树。这可以帮助您节省一些空间。

此外,如果右表非常稀疏,例如,0-0条目太多,则应考虑将它们存储为仅指向一个实例的指针。

顺便说一句,您是否需要支持基于正确的表格或任何排序功能的任何查询?