问题是要想出一个可以使用巨型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(Row row);
- 给出某一行的所有值,比如ROW 1的3和9以及
insertCell(Column col, Row row, int value);
- 插入或覆盖单元格的值
getExcelSheet(FileName);
- 以压缩形式(数据结构)提供整个Excel工作表
这有什么可想象的数据结构?我正在准备面试,这不是功课。我想从不同的人那里获得一些见解。
只是给出一个感觉:说excel表是1TB,我们有8GB的内存。 1 TB的excel表只有许多空单元格,但值遍布不同的单元格
答案 0 :(得分:1)
使用Map / Dictionary将单元格坐标映射到值,为未明确设置的所有内容返回默认值EMPTY_CELL。
基于此实现所需的方法。
答案 1 :(得分:1)
有关sparse matrices主题的大量文献,这是一个广泛使用的术语,用于称为巨型Excel表格。文献涵盖了数据结构和用于创建和修改它们的合适算法;维基百科的文章为您的研究提供了一个很好的起点。它可能会告诉你足够的准备你的面试。
答案 2 :(得分:1)
详细说明塔斯的评论和马克的答案(为其+1):
如果您使用维基百科调用的Keys Of Keys或DOK(这实际上是Jens的答案),您可以有效地插入单元格值,但正如您正确评论的那样,getByRow和getByColumn将会相当慢。
更好的选择是维基百科称为坐标列表或首席运营官:只是一组三元组(rowindex,columnindex,value)。你可能实际上将它存储为三个数组。为了快速插入,保留一组已排序和未排序的条目,并插入未排序的集合;每当未排序的条目数超过阈值T(可能取决于非空单元格K的总数)时,将它们排序到排序集中。
你想要通过行索引对它们进行排序,并将带索引的另一个数组保存到数组中,以给出按列索引排序的版本。
对于getByRow,您将获取按行索引排序的数组的正确部分,并另外搜索未排序的集。
所有这一切都假设你做有足够的内存来存储矩阵中每个非空条目的几个单词。如果没有,你需要将它与某种外部存储器方法结合起来。
答案 3 :(得分:0)
您正在尝试解决经典DBMS问题。请注意,您可以轻松地将操作转换为sql
个查询:
select * from table where rowId = row
select distinct col from table
update table set col=value where rowId = row
因此,我认为您可以使用现有的RDBMS
或(如果您需要自己的实现)众所周知的数据库的设计和算法。
答案 4 :(得分:-2)
您可以将这个神奇的Excel工作表存储在二维数组中,空单元格包含null。如果数据不适合我认为我们运气不好