C++ KNN搜索,增长集,任意范数

C++ KNN搜索,增长集,任意范数,c++,algorithm,search,metrics,knn,C++,Algorithm,Search,Metrics,Knn,假设E3中的以下问题具有任意范数。例如,使用L1范数(汉明、卡尔斯鲁厄、测地线等也适用) 随后,对于i=1:n,我们重复以下步骤: 根据给定的范数,在B中找到距离A[i]最近的点 B * = argmin(|A[i]-B|) 如果B*-A[i]

假设E3中的以下问题具有任意范数。例如,使用L1范数(汉明、卡尔斯鲁厄、测地线等也适用)

随后,对于i=1:n,我们重复以下步骤:

  • 根据给定的范数,在B中找到距离A[i]最近的点

     B * = argmin(|A[i]-B|)
    
  • 如果B*-A[i]
对于最近的搜索,我使用std::partial_排序

   const int k = 1;
   for (int i = 1; i < A.size(); i++) {
       partial_sort(B.begin(), B.begin() + k, B.end(), bind(less<double>(), bind(nL1, _1, A[i]), bind(nL1, _2, A[i])));
       if (nL1(*B.begin(), A[i]) < 1e4) B.push_back(A[i]); //Some threshold, eps=1.0*10^4 
   }
}
const int k=1;
对于(int i=1;i
B在不断增长,搜索成本也越来越高。。。在循环中重复,速度太慢,即使对于小集合(n=1*10^6)。。。在这里,部分排序效率很低

  • 速度是否有显著的改善?当然,也可以使用幼稚的方法(但不是更快)
  • 如何加速nn搜索
当还需要第二个最近点时,会出现另一个问题


由于存在任意范数,因此无法使用当前的k-nn搜索库(该问题可以在球体上解决)。我尝试使用nano-flann,但它不支持某些特定规范…

卡尔斯鲁厄规范是什么?对于测地线,你是说E3中的一些曲面吗?无论如何,你应该仍然能够使用kd树,你只需要能够回答某些问题,比如:这个球(你的标准)包括在这个盒子里吗?卡尔斯鲁厄标准是什么?对于测地线,你是说E3中的一些曲面吗?无论如何,你应该仍然能够使用kd树,你只需要能够回答某些问题,比如:这个球(你的标准)包括在这个盒子里吗?
   B.push_back(A[0]);
 B * = argmin(|A[i]-B|)
   const int k = 1;
   for (int i = 1; i < A.size(); i++) {
       partial_sort(B.begin(), B.begin() + k, B.end(), bind(less<double>(), bind(nL1, _1, A[i]), bind(nL1, _2, A[i])));
       if (nL1(*B.begin(), A[i]) < 1e4) B.push_back(A[i]); //Some threshold, eps=1.0*10^4 
   }
}