桶关键值图?

时间:2015-12-18 08:05:49

标签: c++ containers

我需要一个结构,我可以按键升序排序键值。如果我向一个Key请求一个Value,我想得到Map中最接近的(但不相等)Key的值。

所以例如,我确实推动了100,500和1000.如果我要求750,我会得到1000的价值。如果我要求450,我会获得500 Value。如果我请求500,我得到1000值。这些键是动态的,这里无法切换。

我的方法是将带有键和值的类推送到向量,但这将持续为O(n)。

有没有更好的方法/更快的方法来实现它而不是通过Key向量迭代并进行比较?

3 个答案:

答案 0 :(得分:5)

我认为你应该使用std::map作为容器。 并使用std::map::upper_bound查找最近的更大的密钥。

如果可以接受,则使用std::map::lower_bound

std::map::upper_boundstd::map::lower_bound保证复杂度为O(log(n))。

顺便说一下,如果您仍想使用std::vector,则std::upper_boundstd::lower_bound的复杂性为std::vector <的O(log(n))< / p>

答案 1 :(得分:0)

使用var canExec = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)) .Select(_ => !GetUnsatisfied().Any()); Submit = ReactiveCommand.Create(canExec); Submit.Subscribe(x => OnSubmit()); std::mapstd::map::upper_bound()实现为树,因此std::map保证为O(log(n))。

std::map::upper_bound()使用给定的比较函数按键排序(默认值:std::map)。它应该包括您需要的一切。

答案 2 :(得分:0)

您可以使用堆(最小堆或最大堆)。 insert delete或find是O(log(n)),易于实现。 实际上它与地图相似,但你可以根据自己的想法进行编码。