【发布时间】:2021-10-17 13:20:53
【问题描述】:
给定一个数字,说“KEY”并映射 例子: 答案是 4,因为对于所有小于 7(KEY) 的键,键 4 和键 6 的最大值为 3。4 是最小的键。 地图动态增加,有几个这样的带有KEY的查询。 我试图在 O(logN) 时间内得到 {k,v} 对 我在使用 lower_bound 后卡住了。使用下限给了我最大的“k”,使得 k
更新: 我也确保在对数时间内更新地图。整数不超过 10^5。是否可以使用其他一些数据结构和方法(在这种情况下,它看起来像动态编程/二进制搜索)在对数时间内解决这个问题?map <int, int> myMap = {{3,1}, {4,3}, {5,2}, {6,3}, {7,2}, {8,5}};
// ^^^
int KEY = 7;
【问题讨论】:
-
你可以在每个节点中存储一个key,对应所有前面节点中的最大值。或者有一个单独的键映射到“较小键中最大值的键”。这将使回答这个问题的速度更快 - 但当然它会使更新地图的速度变慢。这可能是也可能不是一个合适的权衡。
-
如果您想通过某些条件进行有效搜索,它必须是键的一部分,而不是值的一部分。似乎
std::map<std::pair<int,int>,T>(或一组)与自定义operator<会更好匹配。 -
这种结构是不可能的。您的条件使您需要考虑 O(N) 个元素。 N 个未知排序的元素。
-
在
{4,3}和{6,3}之间你会如何选择?它们都有 -
@IgorTandetnik 没错。这会使更新地图变慢。所以我们不能使用它。我会相应地更新我的问题。
标签: c++ algorithm dictionary data-structures stl