所以我有三节课。一方面有 Point 类:
public class Point {
public float x;
public float y;
// Every point has a list of connections to other points indicated
// by their position in the list of points in the main class.
public List<Integer> connections = new ArrayList<>();
public Point(float x, float y) {
this.x = x;
this.y = y;
}
}
另一方面, Line 类:
public class Line {
public Point start;
public Point end;
public Line(Point start, Point end) {
this.start = start;
this.end = end;
}
}
组合类:
public class Combination {
public Line a;
public Line b;
public Combination(Line a, Line b) {
this.a = a;
this.b = b;
}
}
我想要一种方法根据从给定点生成的行返回所有可能组合的列表。我目前的做法如下:
public static List<Combination> findCombinations(List<Point> points) {
List<Combination> combinations = new ArrayList<>();
List<Line> lines = new ArrayList<>();
for (Point a : points) {
for (int p : a.connections) {
lines.add(new Line(a, points.get(p)));
}
}
for (Line a : lines) {
for (Line b : lines) {
if (a == b) continue;
combinations.add(new Combination(a, b));
}
}
return combinations;
}
我有一个包含点列表的基类。对于该类的每个实例,我只调用上面的方法一次。但是,创建了很多实例,这种方法会减慢过程。
我需要找到这些组合,以便测试每个Combination
实例中是否存在两条线(段)的交集。我基本上想找到相交的所有线条组合。为此,我需要获得组合,然后检查交叉点的位置。
交叉点的计算不是问题。
答案 0 :(得分:2)
我通过点和线(通常称为节点和边)形成的这种图形通常在运行中迭代所需的组合。 所以通常不应该生成包含所有这些组合的明确列表。
如果你坚持创建所有组合,那么没有比迭代所有组合更快的方法了。 (更新:如果您的任务是查找所有线路交叉点,那么众所周知的算法会更快。此字段称为计算几何体)
如果图形是固定的,你可以加快一点,所以它在创建后不再改变 在这种情况下,您可以替换
public List<Integer> connections = new ArrayList<>();
使用更快的int数组,它也使用了四分之一的内存:
public int[] connections.
此优化通常需要两个步骤。使用ArrayList构建图形,然后在准备就绪后,使用int[]
此外,您提到&#34;效率&#34;。特别是在这里,人们必须决定内存效率(例如使用嵌入式导航系统)或计算速度(具有大量内存时使用)。
您的解决方案,我的答案与计算速度有关。
答案 1 :(得分:0)
如果目的是将新创建的线与所有其他线组合,则可以通过合并新Combination
中的Line
和之前的所有线来远离第二个结构。我不确定这会有多快(如果有的话),但我觉得它在代码组织方面要好一些。
public static List<Combination> findCombinations(final List<Line> lines, final List<Point> points) {
final List<Combination> combinations = new ArrayList<>();
for (Point a : points) {
for (int p : a.connections) {
Line l = new Line(a, points.get(p));
for(int i=0; i<lines.size(); i++){
combinations.add(new Combination(lines.get(i),l));
}
lines.add(l);
}
}
return combinations;
}