Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Data structures 表的最佳数据结构_Data Structures_Sparse Matrix_Tabular - Fatal编程技术网

Data structures 表的最佳数据结构

Data structures 表的最佳数据结构,data-structures,sparse-matrix,tabular,Data Structures,Sparse Matrix,Tabular,我们的团队正在致力于移动平台的表格小部件的实现(其中一个应用程序是类似MS Excel的移动办公) 我们需要优化存储表数据的数据结构(使用简单的二维数组) 您能建议一下存储表格数据的最佳数据结构吗。以下是数据结构的一些要求: 表格的大小可以达到2^32 x 2^32 大多数表单元格是空的(即,表是稀疏的),因此最好不要存储空单元格的数据 数据结构的接口应支持插入/删除行和列 数据结构应允许向前和向后遍历非空单元格 表格的单元格可以合并(即一个单元格可以跨越多个行和/或列) 我建议像在excel

我们的团队正在致力于移动平台的表格小部件的实现(其中一个应用程序是类似MS Excel的移动办公)

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

您能建议一下存储表格数据的最佳数据结构吗。以下是数据结构的一些要求:

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

我建议像在excel中一样存储键值对。例如,假设您的excel文档有A-AA等列。。。和第1-256000行…等等,所以只需将具有日期的值存储在某种类型的键值对中

例如:

someKeyValueStore = new KeyValueStore();

someData = new Cell(A1,"SomeValue");

someOtherData = new Cell(C2,"SomeOtherValue");

someKeyValueStore.AddKeyValuePair(someData);
someKeyValueStore.AddKeyValuePair(someOtherData);

在这种情况下,您根本不必关心空单元格。你只需要访问那些不是空的。当然,您可能希望跟踪集合中的键,以便轻松查看是否具有特定键的值。但这基本上是最简单的处理方法

在详细考虑了行/列插入/删除的问题之后,我想出了一些看起来很有希望的方法

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

对于此表:

 ABCDE
1
2*
3 %  #
4
5   $
你应该:

  • A、 B、D、E-使用的水平指数
  • 2,3,5-使用的垂直指数
  • 将这些A、B、D、E、2、3、5索引值存储在上述两种结构中的某类节点中,这样您就可以在知道节点在内存中的地址的情况下将某些内容链接到该节点(同样,树节点非常适合)

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

    • *:&2,&A
    • %:&3,&B
    • #:&3,&E
    • $:&5,&D
    这足以定义一个表

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

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

    ABCDE
    1.
    2*
    3 %  #
    
    4@二叉搜索树(key=y*2^32+x)可以工作吗?有了这样一棵树,合并看起来也不那么复杂。我对二叉搜索树犹豫不决,因为我需要为每个单元格存储索引。当插入或删除行或列时,我必须更新所有索引。如果你有一个行树,每个行都是树,你可以通过只更新行表中的行索引来避免更新每个单元格中的行索引。我不认为您可以找到一种不需要移动单元格数据或更新行/列插入/删除索引的数据结构。我也会很惊讶地看到用户在移动设备上可以直接编辑一个非常大的表,原因有二:这样的设备上没有太多内存,在上面写或编辑东西也不是很方便。我不认为问题的移动版本足够大,索引更新也不重要。如果我对问题的规模有误解,请在问题中添加更多数据。可能存在允许插入/删除行和列的稀疏矩阵数据结构的实现?或者,例如,D.E.Knuth?Adam建议的舞蹈链接(DLX)数据结构的一些变体,谢谢。你的想法是对的!但我还需要一些关于内部数据结构实现的想法。主要的问题是,当我使用一些稀疏的数据结构时,我必须存储包含单元格数据的单元格。但是,当插入或更新某些行或列时,我必须更新非空单元格的所有索引。也许有一些解决方案可以避免更新单元格索引的必要性?对不起,我还没有写完答案并无意中发布了它:(现在我已经完成(编辑)itAlexey,你的想法听起来很棒!我将尝试实施和测试。完成后,我会给你反馈。谢谢!Alexey,很抱歉延迟反馈。非常感谢!它工作得非常好!
     ABCDE
    1
    2*
    3 %  #
    4  @   <- new row 4
    5      <- used to be row 4
    6   $  <- used to be row 5