我想知道在我的情况下哪种数据结构会很好。请指导我。以下是要求。如下图所示,基于三个值A,B和C(其中A将是整数值而B,C将是字符)。左侧表将具有唯一条目。我想存储两个接受规则号和true / false的值。因此,对于A,B和CI的每个唯一值,要存储与它们对应的两个值(接受规则号和真/假)。一个重要的是接受规则号可以是一个或多个(大小不固定)。其次,表长度可达65025或以上。
P.S:我之前曾问过这类问题,但这次情况略有不同。
答案 0 :(得分:2)
让我们检查一下我们的基础,是吗。
你基本上想要一个三元组(数字,字符,字符)和一个由两个元素组成的对之间的关联:一组接受规则号和一个布尔值(注意:在你的例子中,布尔值与那里的事实相关是否接受规则编号。)
因此,我们采用this answer来了解如何最好地选择标准库容器并愚蠢地关注它的问题:
unordered_
map
multi
就是这样,你需要一把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条目太多,则应考虑将它们存储为仅指向一个实例的指针。
顺便说一句,您是否需要支持基于正确的表格或任何排序功能的任何查询?