在一组三个向量中找到最接近的三元组?
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;
【讨论】:
以上是关于在一组三个向量中找到最接近的三元组?的主要内容,如果未能解决你的问题,请参考以下文章