简化表对象结构的复杂性

时间:2012-03-12 15:01:52

标签: c#

我有一个模仿excel表属性的对象结构。所以我有一个表对象包含标题,标题行对象和正文行对象等属性。在标题行和每个主体行对象中,我有一个单元格对象,每行包含每个单元格的信息。我正在寻找一种更有效的方式来存储这个表结构,因为在我对这个对象的一个​​用途中,我将它的结构打印到屏幕上。目前,我正在为每个单元格打印每行执行O(n ^ 2)复杂度:

foreach(var row in Table.Rows){
   foreach(var cell in row.Cells){
      Console.WriteLine(cell.ToString())
   }
}

是否有更有效的方法来存储此结构以避免n ^ 2?我问这个是因为这个打印功能存在于另一个n ^ 2循环中。基本上我有一个表标题列表和一个表列表。我需要找到那些标题在标题列表中的表。然后,对于每个表,我需要打印他们的行和每行中的单元格。是否可以通过使用不同的数据结构来优化此操作的任何部分?我不知道他们究竟是如何工作的,但我听说过哈希和字典?

由于

3 个答案:

答案 0 :(得分:1)

由于您正在查找具有特定标题的表,因此您可以使用字典按标题存储表

Dictionary<string,Table> tablesByTitle = new Dictionary<string,Table>();

tablesByTitle.Add(table.Title, table);
...

table = tablesByTitle["SomeTableTitle"];

这将使查找表成为O(1)操作。查找n表将是O(n)操作。

然后打印表格取决于行数和列数。没有什么可以改变它。


更新:

string tablesFromGuiElement = "Employees;Companies;Addresses";
string[] selectedTables = tablesFromGuiElement.Split(';');
foreach (string title in selectedTables) {
    Table tbl = tablesByTitle[title];
    PrintTable(tbl);
}

答案 1 :(得分:0)

输出NxN值矩阵没有比N ^ 2操作更有效的方法。最糟糕的情况是,你将永远这样做。

现在,如果不是将值存储在定义行和列的图形关系的多维集合中,而是将它们放在一维集合中并包含每个单元格的行列信息,那么您只需要迭代具有值的单元格。对于完全填充的N行和N列的表,最坏情况仍为N ^ 2(一维数组虽然是线性枚举,但将具有N ^ 2项),但最好的情况是只有一个该表中的单元格被填充(或者没有),这将是恒定时间。

答案 2 :(得分:0)

此答案适用于打印表格部分,但问题已延长。

获取表格部分,请参阅other answer


不,没有。

除非您的值可能遵循某些可预测的分布,否则您可以使用x和y的函数并且根本不存储数据,或者可能是种子和函数。

如果多次需要,可以将打印输出缓存在字符串或StringBuider中。

如果有足够的数据,我猜你可能会应用一些压缩算法,但我不会说这更简单或更有效。