Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于二维空间搜索和Javascript实现的优化数据结构?_Javascript_Algorithm_Bin Packing - Fatal编程技术网

用于二维空间搜索和Javascript实现的优化数据结构?

用于二维空间搜索和Javascript实现的优化数据结构?,javascript,algorithm,bin-packing,Javascript,Algorithm,Bin Packing,我正在开发俄罗斯方块类型的HTML5游戏,需要加强空间优化算法。 需要以最节省空间的方式将不同大小的矩形块添加到画布中。我知道块需要多少空间,我需要找到块可以用固定的x坐标添加的最近点-绝对最近点是一个不错的选择 我已经实现了一个版本,在画布上使用逐像素值检查进行搜索,向下推,直到找到足够的形状可用空间,然后添加它。只有当空间从左到右填满时,这种方法才能(缓慢地)工作——算法可以安全地假设,如果第一个像素列是安全的,则可以添加整个块 我需要让它更坚固,我认为这应该是它的方向 存储一个四叉树来表示

我正在开发俄罗斯方块类型的HTML5游戏,需要加强空间优化算法。 需要以最节省空间的方式将不同大小的矩形块添加到画布中。我知道块需要多少空间,我需要找到块可以用固定的x坐标添加的最近点-绝对最近点是一个不错的选择

我已经实现了一个版本,在画布上使用逐像素值检查进行搜索,向下推,直到找到足够的形状可用空间,然后添加它。只有当空间从左到右填满时,这种方法才能(缓慢地)工作——算法可以安全地假设,如果第一个像素列是安全的,则可以添加整个块

我需要让它更坚固,我认为这应该是它的方向

存储一个四叉树来表示电路板状态,这使我能够更快地确定哪里有空间

每个深度级别存储4个节点-每个节点要么为0表示完全空,要么为1表示“某处有一些东西”。每一个渐进的深度级别都提供了越来越多的关于电路板的信息

given(boardstate, block width, block height)
-calculate the largest grid space the block must span
  // a block which is 242x38 MUST span a 16x16 free space 
  // (based on 1/2 of smallest dimension)
-the block width requires n consecutive free spaces
  // (242/16) = 15
-find the first available 15x1 spaces in the board
-check the surrounding tiles at the next level of depth for collisions
  -check the surrounding tiles at the next level of depth for collisions... etc
-if there's a fit 
  draw the block 
  mark all affected nodes at all depths as 'filled'
表示网格的最佳javascript数据结构是什么?

到目前为止,我考虑过的事情:

A.构建一个完整的
对象,其中包含指向子对象和值的指针,以及一组导航方法。这将是直观的,可能节省空间,但我怀疑速度太慢了

B.将每个网格视为4位,并将深度存储为十六进制数组或对象。如果由一个比我更聪明的人来完成,这可能不仅优化了存储,而且使聪明的位操作可用于比较相邻的单元、打开和关闭块等。我想这将是难以置信的快,难以置信的效率,但这超出了我的能力来构建

C.将每个深度存储在一个数组中<代码>深度[0]=[1,0,0,0];深度[1][1,1,1,0,0,0,0,0,0,0,0,0,0,0]。它的空间效率不高,速度可能也不会太快,但我想我可以集中精力

任何结构的深度都有一个实际的限制(在我上一种方法中,存储4x4空间的可用性的数组超过65000个),在这之后,使用常规迭代器检查画布上最后几个像素的图像数据是不可避免的

那么,A,B,C,其他


像往常一样,所有的见解都很受欢迎。

您想要答案b)并且您想要实现空间填充曲线或空间索引。您不希望将位存储在数组、对象或索引中,而是存储在字符串键中。您希望从左到右读取此字符串键,因此可以使用任何字符串匹配算法轻松查询每个深度。你想在谷歌上搜索尼克的空间索引希尔伯特曲线四叉树博客。但是你的假设是正确的,答案b)非常昂贵,所以我建议你回答a),因为它没有那么慢,而且闭包库已经提供了一个免费的javascript四叉树实现:closure-library.googlecode.com/svn/docs/class\u google\u structs\u quadtree.html

如果你不想使用闭包,几天前出现了一个新的实现:我有一种感觉,我只是触及了许多人已经很好解决的问题的表面。我现在正在通读这些资料,当我有一个有效的资料时,我会更新。谢谢你的回复。墓志铭,原谅我的天真,我是一个不习惯在工作日做这么多数学的前端人。空间索引似乎是存储形状的最有效方法,但我正在努力研究如何在曲线结构中搜索可用空间。“向右检查一个空格”的逻辑并不清楚,我发现的大多数结果都是论文的摘要。想法?我不确定我是否理解你,虽然你的想法很有趣,但你的问题很可能不是搜索和查询或索引问题。四叉树或空间索引不能解决空间优化问题。最有可能的情况是你有垃圾箱包装或2D下料问题。就像通配符告诉我们的那样,四叉树可以加速soley碰撞检测。空间索引用于存储地理坐标或空间索引问题(增强现实)。但我认为你应该寻找深度优先的搜索?如果你使用空间索引,你的画布必须符合2的幂。