我有一个模仿excel表属性的对象结构。所以我有一个表对象包含标题,标题行对象和正文行对象等属性。在标题行和每个主体行对象中,我有一个单元格对象,每行包含每个单元格的信息。我正在寻找一种更有效的方式来存储这个表结构,因为在我对这个对象的一个用途中,我将它的结构打印到屏幕上。目前,我正在为每个单元格打印每行执行O(n ^ 2)复杂度:
foreach(var row in Table.Rows){
foreach(var cell in row.Cells){
Console.WriteLine(cell.ToString())
}
}
是否有更有效的方法来存储此结构以避免n ^ 2?我问这个是因为这个打印功能存在于另一个n ^ 2循环中。基本上我有一个表标题列表和一个表列表。我需要找到那些标题在标题列表中的表。然后,对于每个表,我需要打印他们的行和每行中的单元格。是否可以通过使用不同的数据结构来优化此操作的任何部分?我不知道他们究竟是如何工作的,但我听说过哈希和字典?
由于
答案 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中。
如果有足够的数据,我猜你可能会应用一些压缩算法,但我不会说这更简单或更有效。