有一个小组:
S = {(xi,yi)|1 ≤ i ≤ n}
(xi,yi) (xj,yj) where xi = xj and yi = yj
。
这意味着x和y值是唯一的。我需要找到一个支持这些功能的数据结构:
一个简单的解决方案是创建两个排序数组(一个根据x值排序,第二个根据y值排序)。要使用给定的x找到y,将使用二分搜索来O(logn)
。找到x也一样。
我不能使用多个数组(n个元素),每个元素都是一个点。 我需要找到一个有效的数据结构,可以在最佳时间内完成这些操作。我需要找到:
T(first function)+T(second action)
。
在这种情况下哪种数据结构效率最高?
非常感谢。
答案 0 :(得分:1)
从根本上说,你只需要一对地图:
Map<TypeOfX, TypeOfY> mapXtoY;
Map<TypeOfY, TypeOfX> mapYtoX;
您可以使用Map
的任何具体实施,例如HashMap
,TreeMap
,LinkedHashMap
...
要添加一个点,只需将其添加到:
void addPoint(TypeOfX x, TypeOfY y) {
mapXtoY.put(x, y);
mapYtoX.put(y, x);
}
您可以使用以下内容获取y
x
TypeOfY y = mapXtoY.get(x);
反之亦然。
Guava等库提供BiMap
实现,为您维护这种双向映射。
答案 1 :(得分:0)
注意:我不读你的病情'(xi,yi),(xj,yj)=&gt; xi!= xj&amp;&amp; yi!= yj'和你一样,对我来说这只意味着坐标是唯一的(不是每个x和每个y)。
所以你首先必须创建一个Point对象
public class Point {
public int x;
public int y;
public Point(int x, int y) { this.x = x; this.y = y; }
}
然后将所有积分存储到一个独特的阵列中(你说你需要它)
Point[] POINTS = ... // fill your array depending on your input
最后将数组包装成一个提供所需方法的类
public class PointCollection {
public Point[] points;
public Map<Integer, List<Integer>> mapX = new HashMap<Integer; List<Integer>>();
public Map<Integer, List<Integer>> mapY = new HashMap<Integer; List<Integer>>();
public PointCollection(Points[] points) {
this.points = points;
for (Point p : points) {
mapX.getOrDefault(p.x, new ArrayList<Integer>()).add(p.y);
mapY.getOrDefault(p.y, new ArrayList<Integer>()).add(p.x);
}
}
public int[] getMatchingY(int x) {
List<Integer> result = new ArrayList<Integer>();
for (Point p : this.points)) {
if (p.x == x) result.add(p.y);
}
return result.toArray(new int[result.size()]);
}
public int[] getMatchingX(int y) {
List<Integer> result = new ArrayList<Integer>();
for (Point p : this.points)) {
if (p.y == y) result.add(p.x);
}
return result.toArray(new int[result.size()]);
}
public int[] getMatchingYFromMap(int x) {
List<Integer> result = mapX.getOrDefault(x, new ArrayList<Integer>());
return result.toArray(new int[result.size()]);
}
public int[] getMatchingXFromMap(int y) {
List<Integer> result = mapY.getOrDefault(y, new ArrayList<Integer>());
return result.toArray(new int[result.size()]);
}
}
编辑:根据地图添加解决方案