我需要使用一个平均支持恒定时间查询的数据结构。我认为使用std::unordered_map
是一个很好的方法。我的数据是数字的“集合”。
|115|190|380|265|
这些数字不必按特定顺序排列。我需要大约O(1)
的时间来确定此数据结构中是否存在给定的数字。我有一个使用std::unordered_map
的想法,它实际上是一个哈希表(我正确吗?)。所以数字将是键,然后我将只有虚拟值。
因此,基本上我首先需要确定与给定数字匹配的键是否存在于数据结构中,然后根据该条件运行一些算法。而且与该条件无关,我还想更新一个特定的密钥。假设190
,而我想向其中添加20
,那么现在的密钥就是210
。
现在,数据结构将如下所示:
|115|210|380|265|
之所以要这样做,是因为我有一个遍历二进制搜索树的递归算法。每个节点都有一个int value
,以及指向左节点和右节点的两个指针。当到达叶节点时,我需要在包含current_node->value
的“哈希表”数据结构中创建一个新字段。然后,当我递归返回树时,需要将每个节点的值依次加到存储在键中的先前总和中。而且我的数据结构(我建议应为std::unordered_map
)具有多个数字字段的原因是,每个数字字段都代表从树上的叶节点到中间的某个节点的唯一路径。 。我检查从叶子到给定节点的路径上节点的所有值的总和是否等于该节点的值。因此,基本上,将每个节点的当前值添加到每个键中,以存储该路径上所有节点的总和。我需要扫描该数据结构,以确定任何字段或键是否等于当前节点的值。我也想在几乎恒定的时间内将新值插入数据结构。这是为了进行竞争性编程,我会犹豫使用std::vector
,因为我认为查找元素和插入元素需要线性时间。那会增加我的时间复杂度。也许我应该使用std::unordered_map
以外的其他数据结构?
答案 0 :(得分:4)
您可以使用unordered_map::erase和unordered_map::insert更新密钥。平均时间复杂度为O(1)(BTW,最差的时间为O(n))。如果您使用的是C ++ 17,则还可以使用unordered_map::extract更新密钥。时间复杂度是相同的。
但是,由于您只需要一组数字,我认为unordered_set更适合您的算法。
答案 1 :(得分:3)
#include <unordered_map>
#include <iostream>
int main()
{
std::unordered_map<int, int> m;
m[42]; // add
m[69]; // some
m[90]; // keys
int value = 90; // value to check for
auto it = m.find(90);
if (it != m.end()) {
m.erase(it); // remove it
m[value + 20]; // add an altered value
}
}