【问题标题】: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,会发生什么?

标签: c++ algorithm sorting vector


【解决方案1】:

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

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; 
    } 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 2011-01-05
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多