在一组三个向量中找到最接近的三元组?

Posted

技术标签:

【中文标题】在一组三个向量中找到最接近的三元组?【英文标题】:Finding closest triplet in a set of three vectors? 【发布时间】:2020-08-09 00:00:53 【问题描述】:

给定三个双精度向量,我想对每个向量中的每个元素进行配对,以使每个三元组中最大和最小元素之间的差异最小化,并且每个向量的每个元素都是三元组的一部分。现在,我正在使用std::lower_bound()

double closest(vector<double> const& vec, double value) auto const ret = std::lower_bound(vec.begin(), vec.end(), value); return(*ret); 

int main()
    vector<double> a, b, c; vector<vector<double>> triples;
    for(auto x : a)
       triples.push_back(x, closest(b, x), closest(c, x));
    

假设这里的 a、b 和 c 填充了一些值。问题是,lower_bound() 返回比参数最近的元素不少于。我还想考虑比论点少的元素。有什么好的方法吗?

【问题讨论】:

可以使用2个std::min_element来确定最小向量就是具有最小值的向量。当向量不是最小向量时,它可以在 std::remove_if 内删除。 在你的例子中,为什么你只想删除第一个而不是第二个向量?正如您所说,第三个具有“D”的最小值,您的第二步是删除除那个之外的所有内容。总的来说,您的要求很难理解。如果一个元素不与另一个向量共享任何 A、B 或 C,会发生什么? 【参考方案1】:

我的解决方案是实现以比较相邻元素为结束的二分搜索。另一种可能的解决方案是迭代每个向量/数组的元素,根据需要调整索引以最小化差异(这可能与理想复杂度为 $O(\logn)$? 的二进制搜索相比):

int solve(int A[], int B[], int C[], int i, int j, int k) 
  
        int min_diff, current_diff, max_term; 
  
        min_diff = Integer.MAX_VALUE; 
  
        while (i != -1 && j != -1 && k != -1)  
         
            current_diff = abs(max(A[i], max(B[j], C[k]))  
                            - min(A[i], min(B[j], C[k]))); 
  
            if (current_diff < min_diff) 
                min_diff = current_diff; 
  
            max_term = max(A[i], max(B[j], C[k])); 
            if (A[i] == max_term) 
                i -= 1; 
            else if (B[j] == max_term) 
                j -= 1; 
            else
                k -= 1; 
         
          
        return min_diff; 
     

【讨论】:

以上是关于在一组三个向量中找到最接近的三元组?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:找到最接近查询向量的结果

如何用Python或C++编程实现在一组小数中找出最接近的两个数?

如何使用 word2vec 找到最接近向量的单词

给定一组点或向量,找到彼此最接近的 N 个点的集合

数字择优( 计算一个数与一组数字中的哪一个数字大小最接近)

6.最接近的三数之和