我正在尝试为颜色匹配上下文编写一个有效的配对匹配算法
假设我们有一个对象(代表 CIE-LAB 颜色):
public class labColour {
double l;
double a;
double b;
}
现在假设我们有两个 LabColour 列表:
List<LabColour> list1;
List<LabColour> list2;
每个列表的大小为 n。最后假设我们有一个复杂的函数可以计算两种颜色之间的相似度/距离:
public double cie94ColourDistance(LabColour labColour1, LabColour labColour2) {
final double L1 = labColour1.getL();
final double a1 = labColour1.getA();
final double b1 = labColour1.getB();
final double L2 = labColour2.getL();
final double a2 = labColour2.getL();
final double b2 = labColour2.getL();
double c1 = Math.sqrt(a1 * a1 + b1 * b1);
double deltaC = c1 - Math.sqrt(a2 * a2 + b2 * b2);
double deltaA = a1 - a2;
double deltaB = b1 - b2;
double deltaH = Math.sqrt(Math.max(0.0, deltaA * deltaA + deltaB * deltaB - deltaC * deltaC));
return Math.sqrt(Math.max(0.0, Math.pow((L1 - L2) / (kL * sl), 2) + Math.pow(deltaC / (kc * (1 + K1 * c1)), 2) + Math.pow(deltaH / (kh * (1 + K2 * c1)), 2.0)));
}
我想找到n
两个列表中每个元素之间的最佳匹配。天真的方法是使用嵌套的 for 循环来遍历list1
and list2
,并使用它cie94ColourDistance
来计算每个的最佳匹配。在 O(n^2) 复杂度下,这在计算上是昂贵的。
我可以更快地做到这一点 O(n^2) 吗?如果是这样,怎么做?
此外,有没有办法(例如多线程、某个库、缓存等)在 Java 中加速整个过程?
提前致谢!