与一组数字最接近的数字

发布于 2024-12-18 02:10:49 字数 249 浏览 1 评论 0原文

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

Suppose that we have a set of number as P = { p1, p2, p3, ..., pn } ( length(P) = n ) and choose a number as q. So I want to find an algorithm to get the nearest member of set P to q. So the question is: What structure is appropriate to keep data ( p1, p2, ... ) and algorithms to find nearest member of P to q in O(1) time complexity.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

完美的未来在梦里 2024-12-25 02:10:49
  1. 您无法获得 O(1) 复杂度。通过使用 van Emde Boas 树,您可以得到的最接近的结果是 O(lg lg n)。
  2. 如果集合是静态的,则使用排序向量和二分搜索 (O(lg n)) 来查找最近的元素。
  3. 如果集合可以在查询之间更改,请使用适当的数据结构来维护动态集合(例如,AVL 或红黑树)。
  1. You cannot get O(1) complexity. The closest you can get to that is O(lg lg n) by using a van Emde Boas tree.
  2. If the set is static, use a sorted vector and binary search (O(lg n)) to find the nearest element.
  3. If the set can change between queries, use an appropriate data structure for maintaining dynamic sets (e.g., AVL or red-black tree).
乄_柒ぐ汐 2024-12-25 02:10:49

我能想到获得 O(1) 时间复杂度的唯一方法是使用 O(pn) 空间和 O(pn)对 P 进行预排序并在 pn 大小的数组中分配值的时间。

预排序 P,因此 p1 是最小值,pn 是最大值(我假设它们是整数。)然后存储在大小为 < 的数组中code>(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)

The only way I can think of getting O(1) time complexity is if you can use O(pn) space and O(pn) time to preorder P and allocate values in a pn size array.

Preorder P so p1 is the minimum and pn is the maximum (I assume that they are integers.) Then store in an array with size (pn-p1+1) the values:

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)

Then all you have to check for a certain q is:

if q < A(p1)
    closest = A(p1)
elif q > A(pn)
    closest = A(pn)
else
    closest = A(q)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文