将连续域划分为小方块;如何进行存储和查询?

计算科学 算法 计算几何 离散化 数据结构
2021-12-14 20:20:30

我最近参加了一次软件工程面试,被问到一系列知识领域之外的问题,我觉得这里有一些科学计算原理(我多年前参加了一些 scicomp 课程,当提出了这些问题)。我想知道是否有人知道这是什么问题?我怀疑这是伪装的某种经典问题。

给定一个长度 = n 且宽度 = m 的大矩形。矩形被分成许多不相交的区域,这些区域有各种形状(不一定是凸面的)和大小。每个不相交的区域都分配有一个不同的 ID。假设大约有 200 个这样的不相交区域/ID。此外,假设您有一个巨大的矩阵matmat[i][j]对应于某个坐标(x=i, y=j)mat[i][j]表示该坐标处的 ID。但是mat太大了,无法将其存储在内存中。(我在这里有点困惑,因为他说你得到了这个矩阵,但它没有存储在内存中,所以我不太明白你是如何“给定”矩阵的)

我被问到的第一个问题:

您将如何mat使用易于存储且更高效的内存结构?面试官在这里想要的想法是不断地将大矩形分成非常小的正方形,直到该区域由一个 ID 组成(此时您停止将该区域切割成更小的正方形)。然后保存这个正方形。这听起来很简单,就像网格一样。

我被问到的第二个问题是:

你将如何存储这些正方形?你会使用什么数据结构?我认为他想要某种排序方式,但我不知道他指的是什么。

有谁知道这里有什么好的存储结构?看起来它只是一个正方形的网格,而且我知道有存储结构化和非结构化网格的传统方法(我非常怀疑这是面试官想要的,因为这对于软件工程师来说非常偏离主题)。

然后最后一个问题是

给定一个 (x,y) 坐标,您想快速查询该坐标属于哪个 ID。你会怎么做?我说你可以使用某种二进制搜索(此时,我只是在编造一些东西……),面试官希望我考虑“同时压缩 x 和 y”。我什至不知道这意味着什么。

有谁知道如何快速查询上一个问题中的正方形列表?我想这个问题的答案取决于它的存储方式。

第三个问题让我想起了在不对应于网格元素质心的“示踪剂”坐标处求解欧拉方程,但在那种情况下,我只是找到了最近的邻居并在那里输出了解。但是,不要认为这就是这里想要的答案。

1个回答

在做了一些快速研究之后,我确信面试官正在寻找与其中一个数据树相关的答案。根据应用的不同,一个可能比其他的更好,但它们都适合这个一般描述。

mat[i][j]可能在硬盘上可用 - 现在能够存储 16 TB 的数据 - 但可能无法读入内存 - 我能找到的最好的消费级主板仅支持高达 256 GB 的数据。在这种情况下,您将分块读取矩阵并逐步处理。

我可能会用四叉树(区域四叉树)来回答,因为这是我熟悉的结构。但是有很多像 R-trees,Kd-trees,......见维基百科。

假设矩阵 ×,查询一个点属于哪个叶子(这将对应于找到它所属的 ID)成本请参阅此图像,其中使用四叉树压缩图像。要查找像素的颜色,您将查询树并检索存储在相应叶子中的颜色信息。O(N)mat2N2N