如果你想使用地圖,一個解決方案是創建一個地圖的地圖,一個用於最小值,一個用於最大值。這將需要一些預處理時間,但總體而言,它會更快,因爲通過許多查找長期分攤成本。
你基本上建立一個地圖,對每個有效最小鍵,並且每個值與該mimumum每一個有效的最大鍵地圖..
例如(注意,內未經檢驗的背OF-信封代碼):
// 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;
}
當然,這只是適用於自然數字。如果您需要負值或範圍內的負值或實數值,您需要其他值...
您可能對細分樹感興趣。 –
這個問題還不夠清楚。請舉一個更具體的例子。你是否希望這兩個元素都在一個特定的範圍內?這一對是否代表一個範圍?對於範圍(1,4),(7,9)對(3,8)的結果是什麼?爲什麼? –
我認爲這足夠清楚了嗎?這應該返回false,因爲沒有3和8所在的範圍。 @一個。 – SinByCos