如何在给出x和点列表时找到y?

时间:2016-04-04 07:22:21

标签: java structure

有一个小组:

S = {(xi,yi)|1 ≤ i ≤ n}
分。没有2分(xi,yi) (xj,yj) where xi = xj and yi = yj。 这意味着x和y值是唯一的。我需要找到一个支持这些功能的数据结构:

  1. 给定x,返回y的值,其中(x,y)在S中。如果它不存在则返回"不存在"。
  2. 给定y,返回值x,其中(x,y)在S中。如果它不存在则返回"不存在"。
  3. 一个简单的解决方案是创建两个排序数组(一个根据x值排序,第二个根据y值排序)。要使用给定的x找到y,将使用二分搜索来O(logn)。找到x也一样。

    我不能使用多个数组(n个元素),每个元素都是一个点。 我需要找到一个有效的数据结构,可以在最佳时间内完成这些操作。我需要找到:

    T(first function)+T(second action)

    在这种情况下哪种数据结构效率最高?

    非常感谢。

2 个答案:

答案 0 :(得分:1)

从根本上说,你只需要一对地图:

Map<TypeOfX, TypeOfY> mapXtoY;
Map<TypeOfY, TypeOfX> mapYtoX;

您可以使用Map的任何具体实施,例如HashMapTreeMapLinkedHashMap ...

要添加一个点,只需将其添加到:

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()]);
    }
}

编辑:根据地图添加解决方案