C++ 在给定范围内查找对值
我有一个数组或N对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::
(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;