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)
时间复杂度的唯一方法是使用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)
,可能有一半的时间只有其中一个是正确的。