B树修订版

时间:2010-04-20 08:59:13

标签: java algorithm mergesort b-tree

如果我们正在寻找线交叉点(仅水平和垂直线),我们有n条线,其中一半是垂直的,没有交叉点,那么

对y值的行结束点列表进行排序将使用mergesort

获取N log N.

每个插入删除和搜索我们的数据结构(假设它是一个b树)将是< log n

所以总搜索时间为N log N

我在这里缺少的是,如果使用mergesort排序的时间需要N log N的时间并且插入和删除需要时间< log n是我们丢弃常数因子以给出N log N的总时间。如果不是那么,怎么来< log n在总的ONotation运行时间中丢失了吗?

由于

2 个答案:

答案 0 :(得分:1)

big-O表示法描述了算法的渐近行为。也就是说,它描述了算法的行为,因为 N 趋向无穷大。算法中 N log N 时间的部分将使算法中占用log N 时间的部分相形见绌。当 N 变大时,log N 部分的重要性相对减少。

答案 1 :(得分:0)

我怀疑你的导师指的是Line Segment Intersection的问题,这比简单地对片段进行排序更复杂。您将注意到本文引用了Shamos-Hoey算法,该算法使用二叉树来存储线段并有效地检测交叉点。

迈克尔是正确的,因为对于一次性的线段,使用二叉树是没有意义的。但是,在检测交叉点的情况下,排序后跟搜索会产生二次性能并且不是最好的方法,因此线检测算法使用二叉树。

例如,假设您沿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树结构。