最近的数字组

时间:2011-11-24 21:27:45

标签: algorithm data-structures time-complexity

假设我们有一组数字P = { p1, p2, p3, ..., pn }(长度(P)= n)并选择一个数字q。所以我想找到一个算法来获取集合P的最近成员到q。所以问题是:在p1, p2, ...时间复杂度中,什么结构适合保持数据(O(1))和算法以找到P到q的最近成员。

2 个答案:

答案 0 :(得分:6)

  1. 你无法获得O(1)的复杂性。通过使用van Emde Boas树,你可以得到的最接近的是O(lg lg n)。
  2. 如果集合是静态的,请使用排序向量和二进制搜索(O(lg n))来查找最近的元素。
  3. 如果集合可以在查询之间更改,请使用适当的数据结构来维护动态集(例如,AVL或红黑树)。

答案 1 :(得分:1)

我能想到获得O(1)时间复杂度的唯一方法是,如果您可以使用O(pn)空格和O(pn)时间预先排序P并以pn大小分配值阵列。

预订P因此p1是最小值,pn是最大值(我假设它们是整数。)然后存储在大小为(pn-p1+1)的数组中:

A(p1) = p1
for  i = 2  to  n
    for  q = p(i-1)+1  to  (p(i-1)+p(i))/2
        A(q) = p(i-1)
    for  q = (p(i-1)+p(i))/2  to  p(i) 
        A(q) = p(i)

然后你需要检查某个q是:

if q < A(p1)
    closest = A(p1)
elif q > A(pn)
    closest = A(pn)
else
    closest = A(q)