Android 表示室内地图的数据结构

Android 表示室内地图的数据结构,android,performance,memory,data-structures,Android,Performance,Memory,Data Structures,假设我有一个图像,它表示一个室内场所的地图。在这张地图上,某些区域是“允许的”,而其他区域是不允许的。然后定期获取一组坐标(x,y),并需要检查它们是否在“允许”区域内 目前,我用一个boolean[][]map变量来表示这个映射,其中true表示允许。要进行检查,我只需检查map[x][y] 但是,我所代表的图像可能会变得相当大,比如说最大5000x5000像素。因此,mymap变量在内存中变得太大(在本例中,假设boolean大约占用1个字节,则为25MB) 对于我的问题,有更好的数据结构吗

假设我有一个图像,它表示一个室内场所的地图。在这张地图上,某些区域是“允许的”,而其他区域是不允许的。然后定期获取一组坐标
(x,y)
,并需要检查它们是否在“允许”区域内

目前,我用一个
boolean[][]map
变量来表示这个映射,其中
true
表示允许。要进行检查,我只需检查
map[x][y]

但是,我所代表的图像可能会变得相当大,比如说最大5000x5000像素。因此,my
map
变量在内存中变得太大(在本例中,假设
boolean
大约占用1个字节,则为25MB)

对于我的问题,有更好的数据结构吗?我已经思考了一段时间,但是我看不到任何占用更少空间的东西


提前谢谢

这种情况的常见场景是使用
Rect
结构的数组/
列表
。然后定义,这样一个矩形定义了一个“允许”的区域

然后,给定一个点
(x,y)
,只需在数组/列表上迭代,并检查该点是否位于集合中的任何矩形内。对此,您只需使用
Rect.contains(x,y)
。如果有
Rect
包含问题点,则回答
true
,否则回答
false

这将为您提供非常好的性能/内存消耗率。它通常用于像您这样的应用程序,假设“区域”是矩形的(或者每个区域可以表示为一个理想的小矩形的并集)

另一种选择(如果矩形不是选项)是使用离散多边形来表示分区。如果这是可行的,您可以使用此处介绍的简单算法:它允许您测试给定点在时间
O(n)
中是否位于多边形内部(甚至非常复杂),其中
n
是定义地图分区的所有多边形的所有顶点数


如果您的分区非常分散(即,很难使用偶数多边形的矩形来表示它们),那么您可能没有其他简单的选择。您可以做的是(例如)创建一个包含行容差信息的数组。对于每一行,您将有一个数组
int[]
,其中每个
int
将包含32位,每个位表示连续列的
boolean
值。这与您已经拥有的非常相似,但是您的内存占用将减少8倍,因为每个值只占用一位而不是一个字节。

我喜欢您的想法,唯一的缺点是增加了构建这些Rect对象的复杂性。数据来自包含0和1行的csv文件。我想我可以使用一个递归算法来构建这些矩形…,但这并不简单!我懂了。但是你知道,如果数据以如此痛苦的格式来处理,那么我怀疑你真的没有其他选择。我个人会使用
Rect
/polygon方法,因为大多数平面贴图都可以使用它们来表示。一个算法将在节省内存的情况下获得回报。记住-Android设备有16/24/32MB的内存限制/进程!好的,非常感谢,我想我要咬紧牙关,编写生成poylgons的算法。