Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在给定范围内查找对值_C++_Algorithm_C++11_C++14 - Fatal编程技术网

C++ 在给定范围内查找对值

C++ 在给定范围内查找对值,c++,algorithm,c++11,c++14,C++,Algorithm,C++11,C++14,我有一个数组或N对(v1,v2),其中v1使用索引方法是可以的-例如Boost.ICL解决方案 也就是说,你可以很容易地使用一个std::vector,即使没有排序,我认为只要你在大约100.000甚至1.000.000的范围内,你就可以了(只要你存储实际值,而不是向量中的指针,因为这可能会很慢),确切的数字当然取决于你的threshold struct MyEvent { double v1;//you use double for time double v2; }; std::

我有一个数组或N对
(v1,v2)
,其中
v1使用索引方法是可以的-例如Boost.ICL解决方案

也就是说,你可以很容易地使用一个
std::vector
,即使没有排序,我认为只要你在大约100.000甚至1.000.000的范围内,你就可以了(只要你存储实际值,而不是向量中的指针,因为这可能会很慢),确切的数字当然取决于你的threshold

struct MyEvent {
  double v1;//you use double for time
  double v2;
};


std::vector<MyEvent> events;
struct MyEvent{
double v1;//使用double表示时间
双v2;
};
向量事件;
下面是一个使用1.000.000元素的示例:

搜索时间为42毫秒,其中包括一个比较和可选副本,而您的案例可能有点不同,它是可比较的

更进一步,您可以通过使用例如
std::for_each

std::map
-->以某种方式并行化您的搜索来获得更大的能力,查找元素复杂性为O(logn)
如果您的密钥是唯一的,并且没有内存问题,那么可以使用复杂度分摊(O1)的
std::unordered_map
。 此外,您不需要创建两个贴图。
std::无序的地图起始点。
如果您的密钥不是唯一的,您可以使用
std::unordered_multimap
,但是如果您的密钥会重复很多次,那么查找的复杂性可能会变为(On)。 我建议不要将键类型作为
double
传递

std::hash<double> hashing.
auto temp = hashing(key). // decltype of temp will be size_t
std::unordered_map<std::size_t, std::pair<Event*, Event*>> StartEndPoints;
std::散列哈希。
自动临时=散列(键)。//温度的decltype将为size\u t
std::无序地图起始点;

由于您需要处理三种情况—在给定范围内开始、发生或结束,我们可以将其分为三部分

  • 开始:
    v1
    位于
    [L,R]
  • 结尾:
    v2
    位于
    [L,R]

  • 第三种情况可以表述为
    v1查看Boost.ICL。您仍然可以查看Boost,看看它们如何实现您的目标。然后用这些想法来研究你自己的实现。你写的
    L@Yola:刚刚编辑了第一篇文章,你在寻找一个区间树吗:?
    std::unordered_map
    在你想找到一系列元素时并不太合适。从这个问题来看,我明白,需要找到起点和终点,而不是其中的所有要素。如果需要该范围内的所有元素,最好使用
    std::vector
    ,正如您所建议的那样
    42 ms
    在某些上下文中是很多的。@fjardon确实,它可能是-这就是为什么我写它取决于借口和进一步讨论的原因。据说,生成索引等也需要成本。这就是数据库存在的原因等。非常感谢你,我认为这(感谢劳伦斯在该链接的评论中)或多或少是一样的,我将激励这两种方法来实现这一点
    |---Ev1---|     |---Ev3---|     |---Ev5---|
            |---Ev2---|     |---Ev4---|
                 |
                 LR
    
    struct MyEvent {
      double v1;//you use double for time
      double v2;
    };
    
    
    std::vector<MyEvent> events;
    
    std::hash<double> hashing.
    auto temp = hashing(key). // decltype of temp will be size_t
    std::unordered_map<std::size_t, std::pair<Event*, Event*>> StartEndPoints;