代码之家  ›  专栏  ›  技术社区  ›  Mervin

对于单线程包含(点(x,y))功能,最快的Java集合是什么?

  •  3
  • Mervin  · 技术社区  · 14 年前

    (用于碰撞检查)

    有人能把我往正确的方向推吗?

    5 回复  |  直到 14 年前
        1
  •  5
  •   Mark Peters    14 年前

    //just once
    int[][] occurrences = new int[X_MAX][Y_MAX];
    for (Point p : points ) {
        occurrences[p.x][p.y]++;
    }
    
    //sometime later
    if ( occurrences[x][y] != 0 ) {
        //contains Point(x, y)
    }
    

    如果你不在乎有多少,就一个 boolean

    简言之,基本系列并不是完美的(尽管 HashSet 会很接近)。

    Set<Point> 如果你还没有找到一个为你做这件事的图书馆。像这样:

    public class PointSet implements Set<Point> {
        private final boolean[][] data; 
        public PointSet(int xSize, int ySize) {
            data = new boolean[xSize][ySize];
        }
    
        @Override
        public boolean add(Point e) {
             boolean hadIt = data[e.x][e.y];
             data[e.x][e.y] = true;
             return hadIt;
        }
    
        @Override
        public boolean contains(Object o) {
            Point p = (Point) o;
            return data[p.x][p.y];
        }
    
        //...other methods of Set<Point>...
    }
    
        2
  •  2
  •   Jack    14 年前

    我会用一些 Trove collections

    如果你的积分存储为 int 或者几个 float long :32位用于x坐标,32位用于y坐标。然后你可以用 TLongHashSet 那是一个 HashSet 为处理原始数据而优化(与普通java集合相比,它将更快,占用更少的内存)。

    内景 坐标是这样的

    static private long computeKey(int h1, int h2)
    {           
        return ((long)h1) << 32 | h2;
    }
    

    计算密钥然后使用它

    TLongHashSet set = new TLongHashSet()
    set.add(long v);
    set.addAll(long[] v);
    set.containsAll(..);
    

    如果你有 浮动 长的 .

        3
  •  1
  •   gwohpq9    14 年前

        4
  •  0
  •   Jay    14 年前

    与搜索相比,您需要多久更新一次集合?您应该在此基础上选择适当的数据结构。

    点2d,对吧?那么最好的选择可能是树集,它们的速度非常快,我相信它们依赖于B+树,您可能知道B+树在实际的数据库和文件系统中使用。

        5
  •  -1
  •   Vinh    14 年前