我需要一个结构,我可以按键升序排序键值。如果我向一个Key请求一个Value,我想得到Map中最接近的(但不相等)Key的值。
所以例如,我确实推动了100,500和1000.如果我要求750,我会得到1000的价值。如果我要求450,我会获得500 Value。如果我请求500,我得到1000值。这些键是动态的,这里无法切换。
我的方法是将带有键和值的类推送到向量,但这将持续为O(n)。
有没有更好的方法/更快的方法来实现它而不是通过Key向量迭代并进行比较?
答案 0 :(得分:5)
我认为你应该使用std::map
作为容器。
并使用std::map::upper_bound
查找最近的更大的密钥。
如果可以接受,则使用std::map::lower_bound
。
std::map::upper_bound
和std::map::lower_bound
保证复杂度为O(log(n))。
顺便说一下,如果您仍想使用std::vector
,则std::upper_bound
和std::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::map
。 std::map::upper_bound()
实现为树,因此std::map
保证为O(log(n))。
std::map::upper_bound()
使用给定的比较函数按键排序(默认值:std::map
)。它应该包括您需要的一切。
答案 2 :(得分:0)
您可以使用堆(最小堆或最大堆)。 insert delete或find是O(log(n)),易于实现。 实际上它与地图相似,但你可以根据自己的想法进行编码。