Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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/2/ssis/2.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_Sorting - Fatal编程技术网

C++ 给定一个区间向量,输出区间内重叠次数最多的任意一个数字

C++ 给定一个区间向量,输出区间内重叠次数最多的任意一个数字,c++,algorithm,sorting,C++,Algorithm,Sorting,假设我们这样定义间隔 struct Interval { float start; float end; Interval() : start(0), end(0) {} Interval(float s, float e) : start(s), end(e) {} }) 如何在重叠次数最多的间隔内输出任意一个数字 例如,给定[1.2,3.4]、[2.6,6.8]、[8.5,10.2]、[15.1,18.7] 我们可以输出[2.6,3.4]范围内的任何数字,比如2.7,因为[

假设我们这样定义间隔

struct Interval {
  float start;
  float end;
  Interval() : start(0), end(0) {}
  Interval(float s, float e) : start(s), end(e) {}
})

如何在重叠次数最多的间隔内输出任意一个数字

例如,给定[1.2,3.4]、[2.6,6.8]、[8.5,10.2]、[15.1,18.7] 我们可以输出[2.6,3.4]范围内的任何数字,比如2.7,因为[2.6,3.4]是重叠次数最多(两次)的区间

我的想法是按“开始”对间隔进行排序,然后在所有间隔中运行for循环。对于每个间隔,我们计算以下间隔中小于或等于其“结束”的“开始”数,并更新每个循环的最大值

但这看起来像一个O(n2)解决方案,我们能做得更好吗?

这里有一个简单的
O(n log n)
解决方案,它使用事件和扫描线:

  • 有两种类型的事件:间隔的开始和间隔的结束

  • 我们可以根据事件的坐标对所有事件进行排序(如果两个事件具有相同的坐标,则对应于间隔开始的一个事件应该更早进行排序。如果它们具有相同的类型,则可以按任意顺序进行排序)

  • 现在我们可以迭代区间的排序数组,当我们看到区间的开始时,将+1添加到计数器中,当我们看到区间的结束时,将-1添加到计数器中。计数器的最大值就是答案

  • 为什么它是正确的?在任何时刻,计数器的值都是在当前位置之前开始并在其之后结束的间隔数。这正是我们需要最大化的


  • 时间复杂度是
    O(n log n)
    (我们只是对事件数组进行排序,然后对其进行一次线性传递)。

    沿着范围移动时,如何根据结束位置将结束间隔堆叠在优先级队列中,弹出最近的结束间隔或根据最近的开始间隔推下一个开始间隔,同时保持运行的“重叠”计数?您按开始时间对间隔进行排序的想法可以在O(n log n)中使用如果你还有第二个按结束时间排序的时间间隔列表,你就可以得到正确的负间隔处理作为奖励。可爱。我不确定我是否正确理解了您的算法,但在示例中[2.6,3.4]不是原始间隔之一?我们想要一个在这个范围内的数字,比如2.7或3。1@user3692521问题陈述说我们可以从这个间隔中输出任何数字。很容易证明,在给定的区间中,至少有一个适合的端点。哦,我明白了,这很聪明!