我有一个值列表(一维),想知道查找最接近查询值的最佳数据结构/算法。在这里找到的大多数解决方案(全部?)都是针对2个或更多维度的问题。有人能为我提出适合我的情况的方法吗?
我的直觉告诉我对数据进行排序,然后以某种方式使用二分查找。顺便说一下,任何需要构建或插入时间的树都没有限制,因此可能有人能够建议比简单排序列表更好的树。
我有一个值列表(一维),想知道查找最接近查询值的最佳数据结构/算法。在这里找到的大多数解决方案(全部?)都是针对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];
}
这是O(n log n)的时间复杂度,如果您要执行许多查找操作,则会摊销。
编辑:为此,您必须将排序移出此方法。
正如您已经提到的,最快、最简单的方法应该是对数据进行排序,然后查找数据点的左右邻居。
使用OCaml的Set
:
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
顺便提一下,您可能会喜欢我从OCaml for Scientists和The F#.NET Journal文章中提取的nth-nearest neighbor sample以及遍历网络:第n近邻居。