【发布时间】:2019-04-15 07:01:00
【问题描述】:
我写了一个 k-means 聚类算法和一个颜色量化算法。它们在结果方面按预期工作,但我想让它们更快。在这两种实现中,我都需要解决一个问题:3D 空间中有两个点数组,然后对于第一个数组的每个点,您需要从第二个数组中找到最近的点。我是这样做的:
size_t closest_cluster_index;
double x_dif, y_dif, z_dif;
double old_distance;
double new_distance;
for (auto point = points.begin(); point != points.end(); point++)
{
//FIX
//as suggested by juvian
//K = 1
if (point != points.begin())
{
auto cluster = &(clusters[closest_cluster_index]);
r_dif = cluster->r - point->r;
g_dif = cluster->g - point->g;
b_dif = cluster->b - point->b;
new_distance = r_dif * r_dif + g_dif * g_dif + b_dif * b_dif;
if (new_distance <= std::sqrt(old_distance) - ColorU8::differenceRGB(*(point - 1), *point))
{
old_distance = new_distance;
//do sth with closest_cluster_index;
continue;
}
}
//END OF FIX
old_distance = std::numeric_limits<double>::infinity();
for (auto cluster = clusters.begin(); cluster != clusters.end(); cluster++)
{
x_dif = cluster->x - point->x;
y_dif = cluster->y - point->y;
z_dif = cluster->z - point->z;
new_distance = x_dif * x_dif + y_dif * y_dif + z_dif * z_dif;
if (new_distance < old_distance)
{
old_distance = new_distance;
closest_cluster_index = cluster - clusters.begin();
}
}
//do sth with: closest_cluster_index
}
我该如何改进它? (我不想让它多线程或由 GPU 计算)
【问题讨论】:
-
使用像 kdtree 这样的适当数据结构来获取集群中的所有点,然后对于第一个数组中的每个点,询问该结构的最近点
-
@juvian 你的评论看起来真的很像一个答案;)
-
@YSC 不习惯简短回答,但试了一下^^
-
@ArneVogel 是的,我知道。将此算法拆分为多个线程非常简单。然而,这是我学习工作的一部分。我将测量它的执行时间、评估结果并与其他算法(如中位数切割)进行比较。为了做出公平的判断,我在一个线程中完成所有操作,并且只使用 CPU。
标签: c++ algorithm performance optimization graphics