对于您的First Step,您可以使用 C++11 lambda 来发挥出色的效果(special.size() = K 和 all.size() = N)
#include <algorithm> // std::sort, std::transform, std::find, std::min_element
#include <iterator> // std::distance
std::vector<int> indices;
indices.reserve(special.size());
// locate exact index in all for every element of special. Complexity = O(K * N)
std::transform(special.begin(), special.end(), indices.begin(), [&all](Point2f const& s){
return std::distance(
all.begin(),
std::find(all.begin(), all.end(), s)
);
});
// sort special based on index comparison. Complexity = O(K * log(K))
std::sort(special.begin(), special.end(), [&indices](Point2f const& r, Point2f const& s){
auto i = std::distance(special.begin(), r);
auto j = std::distance(special.begin(), s);
return indices[i] < indices[j];
});
解释:首先,对于 中的每个点special
,计算 中all
特殊元素的起点和位置之间的距离all
,并将结果存储到indices
向量中。其次,通过比较向量special
中每对元素的对应元素来对所有元素进行排序。indices
对于您的第二步,您只需更改计算索引的方式
// locate closest element in all for every element of special. Complexity = O(K * N)
std::transform(special.begin(), special.end(), indices.begin(), [&all](Point2f const& s){
return std::distance(
all.begin(),
std::min_element(all.begin(), all.end(), [&s](Point2f const& a){
return // Euclidean 2D-distance between a and s
});
);
});
说明:与您的第一步相比,唯一的变化是,对于您中的每个元素,special
您都可以找到all
最接近它的元素,您可以通过计算问题中建议的最小欧几里得距离来做到这一点。
更新:您可以通过首先将每个元素的索引存储all
到std::unordered_map
哈希表中来进行空间/时间权衡,然后special
根据对该哈希表的查找进行元素之间的比较。这将第一步的时间复杂度降低到 O(N)(假设 K < N),但为哈希表增加了 O(N) 的存储空间。