2 回答
子衿沉夜
TA贡献1828条经验 获得超3个赞
平均而言,可以产生比 O(n) 更好的结果的简单解决方案是使用kd 树来存储点。构建树的最坏情况复杂度为 O(nlogn)。之后的搜索平均为O(logn),最坏情况为 O(n) (通常对于远离所有其他数据的点)。
此外,您可能对 LSH 或局部敏感散列感兴趣,虽然它是一种近似方法,这意味着您不会总是得到正确的答案,对于高维数据,它提供了重要的加速,其复杂性与所选参数密切相关。
暮色呼如
TA贡献1853条经验 获得超9个赞
对于给定的点P,简单的解决方案:
计算 P 与所有其他点的距离,时间复杂度为 O(n)。
将它们保存为元组列表(或类似的数据结构),即(点,距 P 的距离)的元组。
遍历列表即可获得前 K 个最接近的点,时间复杂度为 O(n)。
第二种解决方案会花费更多的空间复杂度 (O(n^2)) 和随着时间的推移进行维护,但会缩短查找 K 个最近邻居的时间:
将每个点的字典保存为按距离排序的点列表(或类似的数据结构) - 构建此表一次的时间复杂度为 O(n^2 * log(n))。
查找 K 个最近点的时间复杂度为 O(k) - 字典访问 + 从有序列表中复制 k 个元素。
时间复杂度的开销在于以一种保持该数据结构有效的方式添加新点或删除旧点 - 两者都为 O(n*log(n))。
您选择的解决方案应该针对您想要优化的内容
添加回答
举报
0/150
提交
取消