【发布时间】:2013-03-09 01:41:03
【问题描述】:
我对这个算法问题有疑问;我将粘贴问题,然后回顾一下我目前的想法和解决方案。
有N (up to 100,000) 线段定义为[(x1, y1), (x2, y2)],其中x1 < x2 和y1 < y2(例如,线段具有正斜率)。没有线段接触或相交,即使在端点处也是如此。第一段有(x1, y1) = (0, 0)。将每个部分想象成一个人必须攀登的二维山。
一个人从(0, 0) 开始,降落在第一座小山上。每当一个人降落在一座小山上时,他都会爬到尽头,即(x2, y2),然后直接往下跳。如果他降落在另一座山上(路段上的任何地方),这个过程会继续:他爬上那座山并跳跃。如果没有更多的山丘,他会掉到-INFINITY,这个过程就结束了。每座山(x1, y1) -> (x2, y2) 应该是
被认为包含点(x1, y1),但不包含点(x2,
y2),这样如果从上面跌到山上,人就会降落在山上
x = x1 的位置,但是如果他摔倒了他就不会降落在山上
从上面x = x2。
目标是计算他接触了多少座山。
我目前的想法
我正在考虑沿 x 轴在平面上扫一条线。每个段由一个 BEGIN 和 END 事件组成;每次遇到线段的开头,我们将它添加到一个集合中。每次遇到线段的结尾时,我们都会将其从集合中删除。当我们到达当前山丘的终点时,我们应该检查我们可以登陆的最高山丘的集合。但是,我不知道如何确定如何快速检查,因为集合内可能有 N 个条目。另外,跳到另一座山之后,这些的顺序会改变,因为每个路段的坡度可能不同,我不知道如何解释这种差异。
有什么想法吗?
【问题讨论】:
-
没有人发布任何避免在每个事件中遍历
O(n)列表的内容。我正在密切关注这个问题。 -
您能否链接到一些基准数据,以便我们尝试不同的优化?