C ++:具有快速搜索和较少内存要求的数据结构

时间:2013-12-29 06:46:44

标签: c++ data-structures

我想知道哪种数据结构在我的情况下会有效。请指导我。以下是要求。如下图所示,基于三个值A,B和C(其中A将是整数值而B,C将是字符)我想存储两个接受规则数和真/假的值。因此,对于A,B和CI的每个唯一值,想要存储与它们对应的两个值(接受规则号和真/假)。请指导我哪些数据结构将快速搜索并且还将节省内存。在我的情况下桌子长度可达65025或以上。

enter image description here

2 个答案:

答案 0 :(得分:4)

标准库中显而易见的可能性是std::mapstd::unordered_map。对于std::map,您需要创建一个包含ABC的类,并为该类定义一个比较函数。对于std::unordered_map,您需要定义一个哈希函数。

对于快速搜索(对插入和删除的速度很少或没有兴趣),您还可以考虑使用在A,B和C字段上排序的向量。与std::map相比,这通常会提高速度减少使用的空间。缺点是插入和删除变为线性而不是对数(即,更慢 - 可能相当慢很多,特别是当集合很大时)。

至于哪一个更喜欢:如果你使用的是足够大的表格,那么大O复杂性可能会占主导地位,那么std::unordered_map将是明显的选择 - 它会给出常量(预期)复杂。 std::map给出了对数的复杂性。如果您仅使用二进制搜索,则排序的向量也将是对数的。假设您的密钥合理分布,您可以使用插值搜索,该搜索通常具有大致O(log log N)复杂度。 log log N慢慢地非常 - 慢慢地它通常被称为“伪常量”或类似的东西。 IOW,即使对于非常庞大的表格,也没有太多理由相信散列必须明显更快。

Big-O分析与很多更大的表格最相关(例如,数亿,而不是问题中建议的数万个)。对于您建议的表格大小,对数搜索算法可能完全具有竞争力。例如,最多65536个项目,我们预计二进制搜索的比较不会超过16个。

然后归结为平衡内存使用与搜索速度。如果你愿意牺牲一些空间来获得更好的搜索速度,哈希表(std::unordered_map)可能是显而易见的选择。如果您更关心最小化内存使用情况,则排序后的矢量可能会获胜。 std::map可能是三个中最容易实现的,并且(考虑到你所说的大小)它的速度可能不会是一个重大问题(但其他两个可能会更快)。

答案 1 :(得分:3)

我不确定你的内存效率究竟是什么意思,但是像下面这样的数据结构肯定会有效:

struct my_data
{
  int accepting_rule;
  bool true_false;
};

std::map<std::tuple<int, char, char>, my_data> my_map;