【问题标题】:Checking whether a pair of values lies between a range from an array of ranges检查一对值是否位于范围数组的范围之间
【发布时间】:2016-10-03 15:42:37
【问题描述】:

假设这对值是:5 和 10

还有

范围数组 R 是: R = {(6,10), (5,7), (6,9), (4,12)}

在这种情况下,它应该返回 True,因为 5 和 10 都位于 4 和 12 之间。

O(N) 中显然有一个非常简单的解决方案,通过迭代每一对,可以通过基于 R 中值对的第一个值对范围 R 进行排序来进一步改进(尽管我猜排序会使最坏情况 O(n log n))。但是,问题是当我需要找到多对值的答案时。我正在寻找更好的解决方案,可能以某种方式使用map,以减少重新计算某些值的需要。基本上,有没有使用动态规划的方法?

有什么想法吗?代码也会受到赞赏:P

【问题讨论】:

  • 您可能对段树感兴趣。
  • 问题不够清楚。请举一个更具体的例子。您是否希望该对的两个元素都在一个特定范围内?该对是否代表一个范围?对于范围 (1,4),(7,9),对 (3,8) 的结果是什么?为什么?
  • 我觉得够清楚了吧?这应该返回 false,因为没有 3 和 8 都位于的范围。 @A.
  • 好吧,在这种情况下,如果范围数组已经给出并且这是一次性任务,那么只需执行遍历数组并检查每个范围的蛮力。如果你想要一些数据结构,那么你可能想要使用段树(某种 BST)。

标签: c++ algorithm dictionary dynamic-programming


【解决方案1】:

如果您想使用地图,一种解决方案是创建地图地图,一张用于最小值,一张用于最大值。这将需要一些预处理时间,但总体而言,它会更快,因为成本会通过多次查找在长期内摊销。

您基本上是在创建一个映射,其中包含每个有效最小值的键,并在每个值内部创建一个映射,其中包含该最小值的每个有效最大值的键..

例如(当心,未经测试的封底代码!):

// Psuedo-ish C++11

typedef std::map<int, std::vector<R>> MaxMap;
typedef std::map<int, MaxMap> MinMap;

MinMap minMap;

// Build maps
for(range : R)
{
    for(int i=range.min; i<=range.max; ++i)
    {
        MaxMap& maxMap = minMap[i];
        for(int j=range.min; j<=range.max; ++j)
        {
            // We just need some value in the map,
            // so might as well store a list of the original ranges..
            mapMap[j].push_back(range);
        }
    }
}

然后对于查找,您获取最小值并在 MinMap 中查找它,然后在 MaxMap 中查找您的最大值。请记住,MinMap 会为您提供任何给定最小值的所有有效最大值,然后您在 MaxMap 中的查找会告诉您最大值是否是给定最小值的有效最大值......

bool isValidRange(int min, int max)
{
    MinMap::iterator minIt = minMap.find(min);
    if(minIt == minMap.end())
    {
        return false;
    }
    MaxMap& maxMap = minIt->second;
    MaxMap::iterator maxIt = maxMap.find(max);
    if(maxIt == maxMap.end())
    {
        return false;
    }

    return true;
}

当然,这只适用于自然数。如果您需要范围内的负数或实数,您将需要其他东西...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多