Тип данных для квадратной и симметричной таблицы - PullRequest
0 голосов
/ 27 марта 2012

У меня есть таблица, доступ к которой осуществляется по строке и столбцу, где эти два не являются целыми. Однако они будут уникальными и взяты из одного набора. Стол нужно будет расширять, но всегда с конца. Удаление может быть необходимо с середины, но не является приоритетом.

В настоящее время я тестирую 2 подхода:

map<Key, int> headers;
vector<vector<Value> > table;

Или:

map<Key, map<Key, Value> > table;

Что будет более подходящим? Я также открыт для новых предложений.

Примеры, показывающие базовое использование (хотя оба очень упрощенно): здесь и здесь .

1 Ответ

1 голос
/ 27 марта 2012

Все зависит от того, как будет использоваться эта структура: насколько плотно будет заполнена таблица, насколько эффективными должны быть различные операции, насколько большим будет тип полезной нагрузки (Value) и т. Д.

Ваш первый подход (вектор векторов с картой для перевода индексов) представляет собой плотное представление: каждое значение явно хранится в таблице.Если векторы растут с коэффициентом L, то общий избыток распределения для самих данных может доходить до L ^ 2.Например, если L == 1,25, у вас может оказаться более 50% избыточного хранилища;если sizeof(Value) большой или если у вас большой стол, это может быть непомерно велико.Кроме того, расширение таблицы может иногда быть довольно дорогим (когда векторы должны быть перераспределены).

Ваш второй подход (карта карт) потенциально редок.Однако если все парные таблицы (строки, столбцы) будут доступны, он станет плотным.Кроме того, бухгалтерская информация для карт немного больше, чем для векторов.Таким образом, для небольших Value размеров векторный подход может быть более экономичным.Если большая часть вашей таблицы будет заполнена значениями «по умолчанию», то вы могли бы улучшить ситуацию, различая доступ на чтение и запись к таблице: чтение значения может выполнить «поиск» и вернуть синтезированное значение по умолчанию, если заметная записьбыл найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...