【发布时间】:2018-05-09 11:54:00
【问题描述】:
我有两个集合(或地图),需要有效处理它们的交集。 我知道有两种方法可以做到这一点:
- 像 std::set_intersection 一样遍历两个映射:O(n1+n2)
- 遍历一张地图并在另一张地图中查找元素:O(n1*log(n2))
根据大小,这两个解决方案中的任何一个都明显更好(已计时),因此我需要根据大小在这些算法之间切换(这有点混乱) - 或者找到一个优于两者的解决方案,例如使用 map.find() 的一些变体,将前一个迭代器作为提示(类似于 map.emplace_hint(...)) - 但我找不到这样的函数。
问题:是否可以直接使用 STL 或某些兼容库来结合两种解决方案的性能特征?
请注意,性能要求使这与之前的问题有所不同,例如 Efficient intersection of sets?
【问题讨论】:
-
什么“性能要求”使这与链接的问题不同?你只是说你需要它高效,而另一个问题是要求高效地做到这一点......
-
性能要求因调用而异,因此我无法静态选择一种替代方法。链接的问题中未解决该部分。
-
在这个优化级别(不仅仅是使用标准库),我们确实需要查看示例数据和基准。一旦获得实际数据、编译器和硬件,您就可以随时进行更多优化。如果没有这些信息,这个问题实际上与链接的问题并没有太大的不同,即使它表示愿意根据手头的情况切换方法(标准库可能已经这样做了)。
-
@wally 标准 set_intersection 的实现可能会切换方法,但是否有任何实现可以做到这一点?如果有,怎么做?
-
if ((n1+n2) < n1*log2(n2))怎么样,然后选择更好的? (当然还需要考虑n2*log2(n1)))。顺便说一句,这不是一个不同的要求,它只是询问在一般情况下如何有效地做到这一点。很抱歉吹毛求疵,只是想更好地理解你的真正意思,尽管我仍然觉得这很接近被骗
标签: c++ algorithm data-structures