我刚刚开始编写一个新项目,该项目应该在X和Y坐标(可以从0到4,000,000,000)中读取并存储这些点。
因为我不知道要存储多少点,所以我必须在程序运行时分配所需的内存。
然后我想找到相邻点(水平和垂直)以创建“岛”并将所有连接的点存储在一个组中。
现在我不太确定哪种数据类型或如何存储坐标。 我的第一个想法是像2d array [x] [y]那样存储精确点的状态。因此,如果我在位置array [5] [5]上,我可以通过添加x + 1(array [6] [5])轻松请求下一个点的状态。 问题在于我将不得不初始化一个数组,该数组还包含点,这些点根本没有被占用,我认为array [4,000,000,000] [4,000,000,000]根本无法工作。
那么最好的存储空间是什么,这样我就可以读取一个点状态来查找相邻点?
先谢谢了, D
编辑:每个岛也可以有空白
答案 0 :(得分:1)
由于坐标0..4000000000
的范围,使用由坐标索引的2D数组是不切实际的。这就是160亿个单元,不仅超出了当前可以想象的RAM空间,而且扫描如此巨大的几乎空的区域也将非常低效。
您应该研究Quadtrees或适合存储地理数据的类似数据结构。
答案 1 :(得分:1)
选择数据结构需要大量有关程序要执行的操作以及如何使用的信息。您已经给我们提供了一些信息,但是需要更多的信息来找到最佳的数据结构。
给出信息后,我的第一个想法是链接列表的链接列表。 “外部”链接列表可以表示存在(排序)的行,而“内部”链接列表可以表示该行存在(排序)的列。
类似的东西:
struct column
{
uint32_t cidx;
struct column* next;
}
struct row
{
uint32_t ridx;
struct column* column;
struct row* next;
}
链接列表的好处在于,可以轻松地按排序顺序插入元素。按顺序排列分数将帮助您寻找“岛屿”。例如,如果您正在查看第18行第1000列,并想检查第19行第1000列是否存在,则首先要检查next
行元素是否适用于第19行,如果是,请检查相应的列链接列表以查看是否存在1000。