Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 与一组数字最接近的数字_Algorithm_Data Structures_Time Complexity - Fatal编程技术网

Algorithm 与一组数字最接近的数字

Algorithm 与一组数字最接近的数字,algorithm,data-structures,time-complexity,Algorithm,Data Structures,Time Complexity,假设我们有一组数字作为p={p1,p2,p3,…,pn}(长度(p)=n),并选择一个数字作为q。因此,我想找到一个算法来获得集P到q的最近成员。所以问题是:什么样的结构适合保存数据(p1,p2,)以及在O(1)时间复杂度中查找P到q的最近成员的算法 你不能得到O(1)复杂度。通过使用van Emde Boas树,最接近O(lg n) 如果集合是静态的,则使用排序向量和二进制搜索(O(lg n))查找最近的元素 如果集合可以在查询之间更改,请使用适当的数据结构来维护动态集合(例如,AVL或红黑树

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

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

  • 我能想到的获得
    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)
    
    如果qA(pn)
    最近距离=A(pn)
    其他的
    最近的=A(q)
    
    不是一个完全相同的问题,但它的解决方案可能与这个问题有关,就像2分钟前问的那样:我指的是距离q最近的
    P
    !这些数字有什么限制吗?没有,我们有N个数值。你们可以假设这些数字是1D图中的一组点。你们确定O(1)的复杂性吗?这是我的老师给我的一个问题来解决它!这个问题想让我介绍O(1)复杂度算法:-/!是的,除非在P中的“数字”是有限集的一部分的特殊情况下,或者如果度量是不寻常的,你将无法得到O(1)。@StéphaneGimenez:谢谢你的回答:)我认为O(lg n)非常接近O(1),我的老师介绍了使用van Emde Boas树的算法。:)@zvrba:谢谢你的帖子,我接受了你的答案,因为我认为它最接近我的要求答案:)也许想要的解决方案类似于基数排序。当然,这只有在集合P是常数的情况下才有效,即使它是
    O(pn-p1)
    ,有点
    伪O(1)
    。我感觉我的答案是错的。。。请随意否决。请您在回答中进一步解释代码的第一部分,好吗?(
    A(p1)=p1…X(q)=p(i)
    )它基本上预先计算了
    p1
    pn
    @ypercube之间所有整数的最接近的
    pi
    ,因为问题是“什么结构适合保存数据[以及]在O(1)时间复杂度中找到p到q的最近成员”你可能对O(1)没问题查找时间和O(p_n-p_1)预处理时间。一个小问题-
    A((p(i-1)+p(i))/2)
    可能被1关闭;您的代码首先将其分配给
    p(i-1)
    ,然后再分配给
    p(i)
    ,可能有一半的时间只有其中一个是正确的。