Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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 - Fatal编程技术网

Algorithm 一维最近邻的最佳数据结构

Algorithm 一维最近邻的最佳数据结构,algorithm,data-structures,Algorithm,Data Structures,我有一个值列表(一维),我想知道查找最接近查询值的最佳数据结构/算法。我在这里找到的大多数问题解决方案(全部?)都是针对2个或更多维度的。有人能为我的案子提出建议吗 我的直觉告诉我如何对数据进行排序并使用二进制搜索。顺便说一句,对于所需的任何树,其构造或插入时间都没有限制,因此可能有人可以推荐一种比简单排序列表更好的树。对列表进行排序,并使用二进制搜索找到要查找的元素,然后比较左邻域和右邻域。您可以使用O(1)访问的数组 比如: int nearest(int[] list, int eleme

我有一个值列表(一维),我想知道查找最接近查询值的最佳数据结构/算法。我在这里找到的大多数问题解决方案(全部?)都是针对2个或更多维度的。有人能为我的案子提出建议吗


我的直觉告诉我如何对数据进行排序并使用二进制搜索。顺便说一句,对于所需的任何树,其构造或插入时间都没有限制,因此可能有人可以推荐一种比简单排序列表更好的树。

对列表进行排序,并使用二进制搜索找到要查找的元素,然后比较左邻域和右邻域。您可以使用O(1)访问的数组

比如:

int nearest(int[] list, int element) {

    sort(list);
    int idx = binarySearch(element, list);

    // make sure you are accessing elements that exist
    min = (element - list[idx-1] <= list[idx+1] - element) ? idx-1 : idx+1;

    return list[min];
}
int最近(int[]列表,int元素){
排序(列表);
int idx=binarySearch(元素,列表);
//确保您正在访问存在的元素

min=(element-list[idx-1]正如您已经提到的,最快和最简单的方法应该是对数据进行排序,然后查找数据点的左右邻域。

如果插入时间不相关,则在排序的数组上进行二进制搜索是实现O(log N)的最简单方法查询时间。每次添加一个项目时,对所有内容进行排序。对于每个查询,执行二进制搜索。如果找到匹配项,则返回它。否则,二进制搜索应返回该项目的索引,即该项目应插入的位置。使用此索引检查两个相邻的项目,并确定其中哪个项目更接近查询点


我假设有O(1)时间的解决方案。我将尝试考虑一个不涉及太多内存使用的解决方案…

如果您需要比O(log(n))更快的解决方案,您可以使用排序数组或二叉搜索树轻松获得,您可以使用.vEB树为您提供O(log(log(n)))在任意一侧搜索最近的元素。

使用OCaml的

module S = Set.Make(struct type t = int let compare = compare end)

let nearest xs y =
  let a, yisin, b = S.split y xs in
  if yisin then y
  else
      let amax, bmin = S.max_elt a, S.min_elt b in
      if abs (amax - y) < abs (bmin - y) then amax else bmin
模块S=Set.Make(结构类型t=int let compare=compare end)
设最近的xs-y=
设a,yisin,b=S,将y-xs分开
如果是,那么是y
其他的
设amax,bmin=S.max\u elt a,S.min\u elt b in
如果abs(amax-y)

顺便说一句,您可能会欣赏我的from和文章。

首先,我仍然看不到min函数如何返回正确的项。您甚至没有与查询点进行比较。其次,摊销成本似乎没有任何改善……您不应该在执行查询时对列表进行排序。您应该仅在修改collect时进行排序事实上,如果你移动排序,二元搜索应该是O(logn),与排序数组相比,vEB树是一个复杂的占位符。除非点非常密集,否则内存层次结构的影响可能会消除O(logn)和O(logn)之间的理论差异然后是一些。这是令人印象深刻的。我接受这个答案,认为这是迄今为止对于巨大线性数据的最佳理论答案。虽然现实中我将使用排序列表/二进制搜索,这应该足以满足我的目的。BST与二进制搜索相结合听起来非常好。这应该很有趣。我不明白你如何能够d时间上的最近邻,与数据集的大小无关。因此,如果您有任何类似的解决方案,请将其添加到此处,尽管这在现阶段更符合学术好奇心。@Muhammad:这是时间复杂性和空间复杂性之间的折衷。假设您没有空间问题(或值的范围不是那么大),然后您可以简单地创建一个巨大的数组,在位置k处包含与查询值k最近的点。这具有查询时间复杂度O(1)和空间复杂度O(max-min)。我不确定如何提高空间复杂度,但是…好主意。因此,这看起来像是查找最近函数的查找表实现。问题是,我能想到的任何哈希都会将其转换为O(logn)。