【问题标题】:Choosing the right storage in C (X,Y,state)在 C (X,Y,state) 中选择正确的存储
【发布时间】:2019-01-16 13:51:21
【问题描述】:

我刚刚开始编写一个新项目,它应该读取 X 和 Y 坐标(可以从 0 到 4,000,000,000)并存储这些点。

因为我不知道要存储多少点,所以我必须在程序运行时分配所需的内存。

然后我想找到相邻点(水平和垂直)来创建“岛屿”并将所有连接的点存储在一个组中。

现在我不太确定是哪种数据类型或如何存储坐标。 我的第一个想法是拥有一个 2d array[x][y] 来存储该确切点的状态。因此,如果我在位置数组[5][5] 上,我可以通过添加 x+1 (array[6][5]) 轻松请求下一个点的状态。 问题是我必须初始化一个数组,该数组还包含点,根本没有被占用,我认为 array[4,000,000,000][4,000,000,000] 无论如何都行不通。

那么最好的存储是什么,以便我能够读取点状态,从而找到相邻点?

提前致谢, D

编辑:每个岛也可以有间隙

【问题讨论】:

  • @user3386109 是什么让您无法将那个(非常好,谢谢)链接变成答案?我希望这是为数不多的无代码但主题(在我看来,还没有近距离投票)、问得好、回答得好的问题之一。
  • k-d 树的实现可能有点超出我们的提问者的范围。作为替代方案,无需为整个 4Bx4B 网格定义存储来定义该范围内的点。与其考虑[x][y] 的数组,不如简单地定义一个struct point { uint32_t x, y }; 那么您只需要为您拥有的点创建一个结构数组并动态分配存储空间。然后,您可以根据每个点的位置计算您的邻居信息。 (您也可以添加任何您需要的state 信息)
  • 或者,也许是一个哈希表?
  • @user3386109 谢谢你,我必须阅读看看这是否适合我的问题。

标签: c arrays algorithm storage allocation


【解决方案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。

【讨论】:

  • 当所有岛屿都存储完毕后,我想遍历所有岛屿,看看是否可以用表格完全填充它们(例如 4x4 块)。
  • @DavidDabrue 应该可以使用所描述的数据结构
【解决方案2】:

使用由坐标索引的二维数组是不切实际的,因为这些坐标的范围是:0..4000000000。那是 160 亿个单元,不仅超出了当前可以想象的 RAM 空间,而且扫描如此巨大的几乎空白区域也将非常低效。

您应该查看Quadtrees 或适合存储地理数据的类似数据结构。

【讨论】:

  • 谢谢,我不太确定在构建四叉树时是否可以处理指针,但我现在正在阅读我的方法
猜你喜欢
  • 2018-12-13
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2011-11-24
相关资源
最近更新 更多