У меня есть объектная структура, которая имитирует свойства таблицы Excel. Итак, у меня есть объект таблицы, содержащий такие свойства, как заголовок, объект строки заголовка и объекты строки тела. Внутри строки заголовка и каждого объекта строки тела у меня есть объект ячейки, содержащий информацию о каждой ячейке в строке. Я ищу более эффективный способ хранения этой структуры таблицы, поскольку в одном из моих случаев использования этого объекта я печатаю его структуру на экране. В настоящее время я делаю сложность O (n ^ 2) для печати каждой строки для каждой ячейки:

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

Есть ли более эффективный способ сохранить эту структуру, чтобы избежать n ^ 2? Я спрашиваю об этом, потому что эта функция печати существует в другом цикле n ^ 2. В основном у меня есть список заголовков таблиц и список таблиц. Мне нужно найти те таблицы, названия которых есть в списке заголовков. Затем для каждой из этих таблиц мне нужно распечатать их строки и ячейки в каждой строке. Можно ли оптимизировать какую-либо часть этой операции, используя, возможно, другую структуру данных для хранения? Я не уверен, как именно они работают, но я слышал о хешировании и словарях?

Благодарность

c#
0
John Baum 12 Мар 2012 в 19:01

3 ответа

Лучший ответ

Поскольку вы ищете таблицы с определенными заголовками, вы можете использовать словарь для хранения таблиц по заголовку.

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
Olivier Jacot-Descombes 12 Мар 2012 в 16:10

Нет ничего более эффективного, чем операция N ^ 2 для вывода матрицы значений NxN. В худшем случае вы всегда будете это делать.

Теперь, если вместо хранения значений в многомерной коллекции, которая определяет графические отношения строк и столбцов, вы поместите их в одномерную коллекцию и включите информацию строки-столбца с каждой ячейкой, тогда вам нужно будет только выполнить итерацию по ячейки, в которых были значения. В худшем случае по-прежнему N ^ 2 для таблицы из N строк и N столбцов, которая полностью заполнена (одномерный массив, хотя и линейный для перечисления, будет иметь N ^ 2 элементов), но в лучшем случае будет только один ячейка в этой таблице заполнена (или не заполнена), что было бы постоянным временем.

0
KeithS 12 Мар 2012 в 15:13

Этот ответ относится к, печать табличной части, но вопрос был расширен.

Для получения табличной части см. другой ответ.


Нет, нет.

Если, возможно, ваши значения не соответствуют некоторому предсказуемому распределению, тогда вы можете использовать функцию x и y и вообще не хранить никаких данных, или, возможно, семя и функцию.

Вы можете кэшировать вывод на печать в строке или StringBuider, если вам это требуется несколько раз.

Если есть достаточно данных, я думаю, вы могли бы применить какой-нибудь алгоритм сжатия, но я бы не сказал, что это было проще или эффективнее.

0
Community 23 Май 2017 в 12:29