我怀疑你的导师指的是Line Segment Intersection的问题,它比简单地对线段进行排序更复杂。您会注意到本文引用了 Shamos–Hoey 算法,该算法使用二叉树来存储线段并有效地检测交叉点。
Michael 是正确的,因为对于一次性的线段,使用二叉树是没有意义的。然而,在检测交叉点的情况下,排序后搜索将产生二次性能,并不是最好的方法,因此线检测算法使用二叉树。
例如,假设您沿 x 轴从左到右对线段进行排序。一个简单的检测算法将类似于:
for (int i=0; i<segs.length - 1; ++i) {
boolean searching = true;
for (int j=i+1; j<segs.length && searching; ++j) {
if (segments overlap on x-axis) {
// Check for intersection.
} else {
// No overlap so terminate inner loop early.
// This is the advantage of having a sorted list.
searching = false;
}
}
}
由于双重嵌套循环,最坏的情况是 O(n^2),并且发生在所有线段在 x 轴上重叠时。最好的情况是线性的,并且在 x 轴上没有任何线段重叠时发生。
您可能希望从实现朴素算法开始,然后是使用 B 树结构的算法。