二维坐标网格JavaScript的O(1)复杂度搜索数据结构

时间:2019-02-18 21:46:25

标签: javascript data-structures

问题

我试图在p5.js中实现一个数据结构来表示图块的地图,但是在JavaScript中,我无法创建一个固定大小的2D数组,这对于在恒定时间内进行搜索非常理想。

当前,这只是一个简单的一维数组,按从上一行到下一行的顺序存储所有切片对象。实现如下所示。

我想要一个解决方案,用于从特定坐标中抓取一个瓦片对象,而不必搜索每个瓦片,直到瓦片对象x和y与我要搜索的对象匹配为止。

这是我对网格的实现:

this.tiles = [];

for(x = 0; x < this.canvasWidth; x += this.tileWidth) {
  for(y = 0; y < this.canvasHeight; y += this.tileHeight) {
    var tile = new Tile(x, y, this.tileWidth, this.tileHeight)
    this.tiles.push(tile);
  }
}

我尝试过的方法

我尝试使用字典类型的结构来实现它,该结构将坐标对象映射到tile对象,因此我可以在搜索时创建坐标对象,但无法弄清楚。

1 个答案:

答案 0 :(得分:0)

使用数组数组代替,外部数组用x索引,内部数组用y索引,内部数组的值是tile:

this.tiles = [];
for(x = 0; x < this.canvasWidth; x += this.tileWidth) {
  const xArr = [];
  for(y = 0; y < this.canvasHeight; y += this.tileHeight) {
    var tile = new Tile(x, y, this.tileWidth, this.tileHeight)
    xArr.push(tile);
  }
  this.tiles.push(xArr);
}

然后,例如

this.tiles[3][6]

将引用Tile为3且x为6的y

这取决于您所质疑的xy从0开始。如果它们不是从0开始,请考虑使用MapMap(如果结构是矩形),或者(如果结构不是矩形)使用带有表示{{ 1}}和x坐标,例如

y

如果结构是矩形,则只要继续将起始{ "3_4": <tile correspoding to x of 3, y of 4> } x标记添加到查找中,就可以继续使用数组数组,尽管这可能会有点困难阅读。