由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 请教一道题:skyline
相关主题
尘埃落定里面的矩形题next larger element in unsorted array
G家电面,已挂问两个C++的问题
问一个题做了一下Kth small in young tablet 和 largest rectangle contain 1s
Google interview question问一道题
Google的电话面试题问个问题
Google onsite interview questions今早的G电面,郁闷坏了...
O(NlogN) largest rectangle in histogram是时候搞EPI了
请问一道面试题G家面试题
相关话题的讨论汇总
话题: point话题: rect话题: rects话题: int话题: new
进入JobHunting版参与讨论
1 (共1页)
y*******8
发帖数: 112
1
各位大神,请教这个老题目skyline。之前有帖子提过
http://www.mitbbs.com/article_t1/JobHunting/32579865_0_1.html
http://www.mitbbs.com/article_t/JobHunting/32569901.html
但是没有看懂解答。
一堆interval,带有start和end,以及高度,整合之后, 请输出每个时间段及这个时
间段内最大的高度。
Example Input:
S1: {[2,5], vol=10}, {[6,10], vol=2}
S2: {[1,6], vol=1}, {[8,12], vol=8}
Example Output:
[1,2],vol=1, [2,5], vol=10, [5,6], vol = 1, [6,8], vol = 2, [8,12], vol = 8.
我的思路是先对start排序,按照sorted的顺序入min heap,每次入的时候按照end坐标
弹出heap中的最早结束的interval。但是怎么分段和计算最大高度,我就想不出来了。
先谢谢各位大神了!
j****y
发帖数: 684
2
http://elementsofprogramminginterviews.com/solutions/
search "draw the skyline"

【在 y*******8 的大作中提到】
: 各位大神,请教这个老题目skyline。之前有帖子提过
: http://www.mitbbs.com/article_t1/JobHunting/32579865_0_1.html
: http://www.mitbbs.com/article_t/JobHunting/32569901.html
: 但是没有看懂解答。
: 一堆interval,带有start和end,以及高度,整合之后, 请输出每个时间段及这个时
: 间段内最大的高度。
: Example Input:
: S1: {[2,5], vol=10}, {[6,10], vol=2}
: S2: {[1,6], vol=1}, {[8,12], vol=8}
: Example Output:

l*****a
发帖数: 14598
3
你给这个link的solution太长了
好的解法十行上下就解决问题了
http://stackoverflow.com/questions/3208955/skyline-algorithm

【在 j****y 的大作中提到】
: http://elementsofprogramminginterviews.com/solutions/
: search "draw the skyline"

y*******8
发帖数: 112
4
谢谢指点!

【在 j****y 的大作中提到】
: http://elementsofprogramminginterviews.com/solutions/
: search "draw the skyline"

y*******8
发帖数: 112
5
谢谢指点!

【在 l*****a 的大作中提到】
: 你给这个link的solution太长了
: 好的解法十行上下就解决问题了
: http://stackoverflow.com/questions/3208955/skyline-algorithm

x*********w
发帖数: 533
6
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
public class EPI_15_1 {
static class Rect {
public int lft;
public int rgt;
public int height;

public Rect(int l, int r, int h) {
lft = l;
rgt = r;
height = h;
}
}

static class Point {
public boolean start;
public int pos;
public int height;

public Point(boolean s, int p, int h) {
start = s;
pos = p;
height = h;
}
}

static class PointComparator implements Comparator {
@Override
public int compare(Point o1, Point o2) {
return o1.height - o2.height;
}
}

static void printSkyLine(Rect[] rects) {
if (null == rects)
return;

Map map = new HashMap();
List points = new ArrayList();
for (Rect rect : rects)
{
Point s = new Point(true, rect.lft, rect.height);
Point e = new Point(false, rect.rgt, rect.height);
points.add(s);
points.add(e);
map.put(e, s);
}

Collections.sort(points, new Comparator() {
@Override
public int compare(Point o1, Point o2) {
return o1.pos - o2.pos;
}
});

SortedSet tree = new TreeSet(new PointComparator());
for (Point pt : points) {
int curHeight = tree.isEmpty() ? 0 : tree.last().height;
if (pt.start)
tree.add(pt);
else
tree.remove(map.get(pt));

if (tree.isEmpty())
System.out.println(pt.pos + " ===> " + curHeight);
else if (tree.last().height != curHeight)
System.out.println(pt.pos + " ===> " + tree.last().height);
}
}

public static void main(String[] strs) {
Rect[] rects = new Rect[8];
rects[0] = new Rect(0, 2, 1);
rects[1] = new Rect(1, 5, 3);
rects[2] = new Rect(3, 7, 4);
rects[3] = new Rect(4, 8, 2);
rects[4] = new Rect(6, 13, 3);
rects[5] = new Rect(9, 11, 5);
rects[6] = new Rect(10, 15, 1);
rects[7] = new Rect(12, 14, 2);

printSkyLine(rects);
}

}
a*******l
发帖数: 98
7
我觉得只需要一个max heap获取维护当前最高顶, 和一个点集来保存skyline的边界点。
先把所有坐标按x轴排序(无论起点还是终点),然后从左到右扫描:
每扫到一个起点S,就把当前楼顶L加入heap,如果L是最高顶时,skyline中添加起点S
,以及S和之前最高顶的交点;
每扫到一个终点E,如果当前楼顶L不是heap中最高顶,忽略;如果是最高顶,从heap中
删除L,然后在heap中找到现存的最高顶L1(从heap中不断取出最高顶如果是之前终结
的就继续直到heap为空,此时L1为地平线),然后skyline中要添加当前终点E,以及E
和L1的交点。
时间复杂度为O(nlogn),空间复杂度为O(n)。
b*****a
发帖数: 70
8
The algorithm in your link is not efficient because it needs too much space
if the intervals span a long range. On the other hand, the implementation
in EPI is best in my opinion.

【在 l*****a 的大作中提到】
: 你给这个link的solution太长了
: 好的解法十行上下就解决问题了
: http://stackoverflow.com/questions/3208955/skyline-algorithm

y*******8
发帖数: 112
9
我觉得他说的答案是这个:http://www.algorithmist.com/index.php/UVa_105
Sweep Line 应该是正解。
按照begin排序入heap,按照end顺序出heap,同时用Red-Black-Tree保持当前最高高度
。总体复杂度O(NlogN).

space

【在 b*****a 的大作中提到】
: The algorithm in your link is not efficient because it needs too much space
: if the intervals span a long range. On the other hand, the implementation
: in EPI is best in my opinion.

1 (共1页)
进入JobHunting版参与讨论
相关主题
G家面试题Google的电话面试题
LinkedIn面经(已跪),攒个rpGoogle onsite interview questions
算法--找一个unsorted array的largest and second largest 最O(NlogN) largest rectangle in histogram
关于K个sorted数组中第n大数的问题请问一道面试题
尘埃落定里面的矩形题next larger element in unsorted array
G家电面,已挂问两个C++的问题
问一个题做了一下Kth small in young tablet 和 largest rectangle contain 1s
Google interview question问一道题
相关话题的讨论汇总
话题: point话题: rect话题: rects话题: int话题: new