我们的团队正在为移动平台实施表格小部件(应用程序之一是移动办公,例如MS Excel)。

我们需要优化用于存储表数据的数据结构(使用简单的二维数组)。

请为您推荐用于存储表数据的最佳数据结构。以下是对数据结构的一些要求:


表格的大小最大为2 ^ 32 x 2 ^ 32;
大多数表单元格是空的(即表是稀疏的),因此最好不要存储空单元格的数据;
数据结构的接口应支持插入/删除行和列;
数据结构应允许在非空单元格中向前和向后进行迭代;
表格的单元格可以合并(即,一个单元格可以跨越一个以上的行和/或列)。

最佳答案

在考虑了更多关于行/列插入/删除的问题之后,我提出了一些看起来很有希望的东西。

首先,创建并维护2个排序的数据结构(例如搜索树),其中包含具有至少一个非空单元格的所有水平和所有垂直索引。

对于此表:

 ABCDE
1
2*
3 %  #
4
5   $


您将拥有:


A,B,D,E-使用的水平索引
2,3,5-使用的垂直索引


将上述A,B,D,E,2、3、5索引值存储在上述2种结构中的某种节点内,这样您就可以链接到它,知道该节点在内存中的地址(同样,树节点非常适合)。

在每个单元格(非空)中,有一对指向其位置的索引节点的链接(我使用&表示节点的链接/引用):


*:&2,&A
%:&3,&B
#:&3,&E
$:&5,&D


这足以定义一个表。

现在,我们如何处理行/列插入?我们将新的行/列索引插入到相应的(水平或垂直)索引数据结构中,并更新其后的索引值(=右边或下面)。然后,我们为此新行/列(如果有)添加新单元格,并将它们链接到适当的索引节点。

例如,让我们在第3行和第4行之间插入一行,并在4C下在其中添加带有@的单元格(在新行中):

 ABCDE
1
2*
3 %  #
4  @   <- new row 4
5      <- used to be row 4
6   $  <- used to be row 5


您的索引结构现在为:


A,B,C(新),D,E-使用的水平索引
2,3,4(新),6(以前是5)-使用的垂直索引


现在,这些单元链接到索引节点,如下所示:


*:&2,&A-与以前相同
%:&3,&B-与以前相同
#:&3,&E-和以前一样
@:&4,&C-链接到新索引节点4和C的新单元格
$:&6,&D-以前是&5,&D


但是看看$单元格。它仍然指向与以前相同的两个物理节点,只是垂直/行节点现在包含索引6而不是索引5。

如果$单元下方有100个单元节点,例如仅占据5个非空行,则只需要更新行/垂直索引数据结构中的5个索引,而不是100。

您可以用类似的方式删除行和列。

现在,要使这一切有用,您还需要能够通过其坐标定位每个单元。

为此,您可以创建另一个排序的数据结构(同样,可能是搜索树),其中每个键都是索引节点地址的组合,而值是单元格数据(或单元格数据本身)的位置。

这样,如果要进入单元格3B,则在索引数据结构中找到3和B的节点,取它们的地址&3和&B,将它们组合为&3 * 232 +&B,然后使用它作为关键字来定位我刚刚定义的第三个数据结构中的%cell。 (注意:232实际上是2指针大小,以位为单位,并且可能因系统而异。)

无论其他单元格发生什么情况,即使%单元格的索引从3B变为其他内容,%单元格链接中的地址&3和&B都将保持不变。

您可以在此基础上轻松开发迭代。

合并也应该是可行的,但是我并没有专注于此。

10-07 18:51
查看更多