假设数组具有元素[1,n]
。元素(m个查询)一个接一个的连续输入。如下所示。
[1,5,10]
[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)
效率更高。
答案 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));
}