Скажем, я работаю над клонов Excel на C#. Моя сетка представлена следующим образом:Правильная структура данных, используемая для клона Excel
private struct CellValue
{
private int column;
private int row;
private string text;
}
private List<CellValue> cellValues = new List<CellValue>();
Каждый раз, когда пользователь добавить текст, я просто упаковать его как CellValue и добавить его в cellValues. Учитывая тип CellValue, я могу определить его строку и столбец в O (1) раз, что отлично. Однако, учитывая столбец и строку, мне нужно пройти через все cellValues, чтобы найти, какой текст находится в этом столбце и строке, что ужасно медленно. Кроме того, учитывая текст, мне тоже нужно перебирать всю вещь. Есть ли какая-либо структура данных, в которой я могу выполнить все 3 задачи в O (1) раз?
Обновлено: Просмотрев некоторые ответы, я не думаю, что нашел тот, который мне нравится. Могу ли я:
- Не хранить более 2 копий CellValue, чтобы избежать их синхронизации. В мире C я бы неплохо использовал указатели.
- Динамические добавления строк и столбцов (в отличие от Excel). .
Без сомнения, это самый быстрый, только немного дорогой с точки зрения хранения. Тем не менее, большинство данных таблиц, как правило, локализованы, скажем, для A1: F2, что может быть лучшим вариантом. – paxdiablo
Точно. У вас может быть 10000 строк из 1000 столбцов всего за 40 МБ + фактических данных, если вы используете ссылочный тип. Вряд ли много :) –
40MB?!? Это кучи! Женам visicalc пришлось бороться с ограничениями пространства в то время, когда некоторые люди говорили: «640 КБ должно быть достаточно для всех!». (Да, это был язык в щеку!) – Arafangion