在C(X,Y,state)中选择合适的存储空间

时间:2018-08-09 07:33:07

标签: c arrays algorithm storage allocation

我刚刚开始编写一个新项目,该项目应该在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

编辑:每个岛也可以有空白

2 个答案:

答案 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。