有效插入数组后查找每个元素的底面和天花板

时间:2019-05-18 22:00:34

标签: arrays algorithm data-structures sortedlist

假设数组具有元素[1,n]。元素(m个查询)一个接一个的连续输入。如下所示。

  1. 5,因此您必须将1打印为楼板,将10打印为ceil,然后数组变为[1,5,10]
  2. 2,所以将1打印为楼板,将5打印为ceil和数组变为[1,2,5,10]
像这样的

给出了m个查询。 Floor和ceil,并且由于我们正在维护arraylist排序,因此可以发现O(log n)时间复杂度。

但是问题是找到要插入的元素位置是O(log n),插入是O(n),以便在最坏的情况下移动其他数字,从而导致每个查询的O(log n) + O(n)

因此,对于m个查询,最坏的情况是mxO(logn + n),这太昂贵了。我希望此操作比mxO(logn + n)效率更高。

1 个答案:

答案 0 :(得分:1)

您应该使用平衡的二进制搜索树代替数组。插入和上下边界(即“地板”和“天花板”)均在O(log n)中完成,因此总运行时间为O(m log m)

您没有提到该语言,但是作为示例,使用C ++ set容器(实现了二进制搜索树),代码看起来像这样:

std::set<int> A;
A.insert(1);
A.insert(n);

for(int i = 0; i < m; ++i) {
    int x;
    scanf("%d", &x);
    assert(1 < x && x < n);
    auto iter = A.insert(x).first;
    printf("floor: %d, ceil: %d\n", *prev(iter), *next(iter));
}