Algorithm 提出数据结构,以矩阵形式处理大量数据(将其视为excel工作表)

Algorithm 提出数据结构,以矩阵形式处理大量数据(将其视为excel工作表),algorithm,excel,memory,data-structures,Algorithm,Excel,Memory,Data Structures,问题是要设计出一个可以处理巨大excel表的数据结构(显然不能像现在这样放入主内存) 假设以下内容是excel工作表的一部分,其中e表示一个空单元格 A B C D ... 1 3 9 e e ... 2 e e e e ... 3 e e 5 e ... 4 e e e e ... 5 e e 6 e ... 因此,数据结构应该允许我将excel工作表存储到内存中(我们知道只有excel工作表中的值才能放入主内存),并支持以下操作 getByColumn(Column col)

问题是要设计出一个可以处理巨大excel表的数据结构(显然不能像现在这样放入主内存)

假设以下内容是excel工作表的一部分,其中e表示一个空单元格

  A B C D ...

1 3 9 e e ...

2 e e e e ...

3 e e 5 e ...

4 e e e e ...

5 e e 6 e ...
因此,数据结构应该允许我将excel工作表存储到内存中(我们知道只有excel工作表中的值才能放入主内存),并支持以下操作

getByColumn(Column col)-给出某一列的所有值,例如C列的5,6

getByRow(行)-给出某一行的所有值,例如第1行的3和9以及更多值

insertCell(列col、行Row、int值)-插入或重写单元格的值

getExcelSheet(文件名)-以压缩格式(数据结构)提供整个excel工作表

什么是可思考的数据结构?我正在准备面试,这不是家庭作业。我想从不同的人那里获得一些见解


只是想说明一下:假设excel表是1TB,我们有8GB的内存。1 TB的excel工作表只有许多空单元格,但值分布在不同的单元格上

使用映射/字典将单元格坐标映射到值,为未明确设置的所有内容返回默认值空单元格


在此基础上实现所需的方法。

您可以将此神奇的excel表存储在二维数组中,空单元格中包含null。如果数据也不符合这一点,我认为我们运气不好

有大量关于的文献,这是一个广泛使用的术语,你称之为巨大的Excel表格。文献包括数据结构和用于创建和修改它们的合适算法;维基百科的文章为你的研究提供了一个很好的起点。它可能会告诉你足够的信息来为面试做好准备。

塔斯社的评论和马克的回答(其中+1):

如果使用wikipedia所称的键字典或DOK(这基本上是Jens的答案),您可以有效地插入单元格值,但正如您正确地评论的那样,getByRow和getByColumn将相当缓慢

更好的选择是wikipedia所称的坐标列表或COO:只是一组三元组(rowindex、columnindex、value)。实际上,您可能会将其存储为三个数组。为了快速插入,保留一组已排序和未排序的条目,并插入到未排序的集合中;每当未排序的条目数超过阈值T(这可能取决于非空单元格的总数K)时,将它们排序到已排序的集合中

您需要按行索引对它们进行排序,并在数组中保留另一个带有索引的数组,以给出按列索引排序的版本

对于getByRow,您将获取按行索引排序的数组的正确部分,并另外搜索未排序的集合


所有这些都假设您有足够的内存为矩阵中的每个非空条目存储两个单词。如果没有,您需要将其与某种外部内存方法结合起来。

您能为需要支持的操作显示一些具体代码吗?比如我将如何使用getByRow或getByColumn?我会一个接一个地检查字典,直到行或列的末尾才询问值是否存在吗?完全正确。当然,还有调整的余地。假设你的应用程序经常使用一小部分完整的行,你可以实现一个缓存来保存最后的n行,以避免重复创建它们。我非常喜欢你的想法,因为它很简单,让我可以轻松实现不同的方法。我们似乎只保存存在的单元格的值,如果单元格不存在,则返回空值,如果元素存在,则可以将其插入映射或更新元素。然后,getByColumn将是O(n),其中n是行数,而对于getByRow,则是O(m),其中m是行数。Insert是O(1),getExcelSheet基本上是在构建字典,所以O(n*m)。对吗?但是,这会消耗多少内存呢?假设excel表是1TB,我们有8GB的内存。1 TB的excel工作表有很多空单元格,但分布在不同的单元格中。我看到了,所以你有点想压缩数据。您可以将空值重新定义为类似于e_x的值,其中x是所选编程语言中并发空值单元格的数量。是的,excel工作表可以看作是一个巨大的稀疏矩阵。但是如何减少存储稀疏矩阵所需的内存空间?我能有效地插入单元格值吗?有了这么多的数据,excel不再是合适的工具。通过CSV转换到另一种语言,或者直接从excel转换到C#(虽然我不熟悉Microsoft生态系统)。@Tass它不是excel,想象一下这是任何类型的CSV或类似的东西。excel与ms excel不同。这与数据的存储方式无关。这是关于阅读他们的任何格式。谢谢你的解释。我认为在面试的时候,字典的方法就足够了,如果面试官要求某种类型的优化,我会说你的解释是令人满意的。