从值中查找间隔

时间:2011-04-22 22:54:01

标签: c++ find

假设我有一个间隔列表:[1, 90], [104, 234], [235, 300], ...。每个间隔都有一个名称A1, B, B1, ...。给定一个值,我想要间隔的名称(112 -> B100 -> special_value)。什么是最好和更快的实施?比if / else if列表更好。

间隔按顺序排序,没有重叠。我有很多值作为输入,但只有一组间隔。尺寸间隔非常不同,有些非常小,其他非常大。

3 个答案:

答案 0 :(得分:3)

想法:为间隔的开始值创建一个地图对象。如果我们找到了可能的间隔,请检查该值是否在间隔内。

class MyInterval
{
public:
  MyInterval( double begin, double end )
  : m_begin(begin), m_end(end)
  {
  };
  double m_begin, m_end;
};

bool operator < (  const MyInterval& left,  const MyInterval& right )
{
  return ( left.m_begin < right.m_begin );
}

std::map<MyInterval,std::string> store;
// use upper_bound to get the place+1 and then you could check the interval
std::map<MyInterval,std::string>::iterator iter = store.upper_bound( MyInterval(value,value) );
if ( iter != store.begin() )
{
  --iter;
  if ( iter->first.m_end >= value ) 
  {
    std::string result_text = iter->second;
    // Here is your result
  }
}

更多信息:link

在Visual Studio 2010中进行了测试。

答案 1 :(得分:1)

从您的示例中看,区间按顺序排序,并且没有重叠。但可能存在差距。

任何类型的迭代都会产生一个O(N)解决方案 - 你可以通过二进制搜索你的值适合的区间来改进它。

答案 2 :(得分:0)

else if序列的最简单的改进是创建一个间隔的链表(或数组)并迭代它。这似乎是一个非常简单的建议,所以我希望它能解决你的问题。