У меня есть большое количество записей, например, около 4 000 000, которые я хочу неоднократно обращаться к ним и помещать информацию в класс, связанный с этой записью. Я не уверен, какую структуру данных мне следует использовать? Должен ли я использовать векторы, карты или хэш-карты. Мне не нужно вставлять запись, но мне нужно прочитать таблицу, которая содержит наборы номеров (или имен) этих записей, а затем взять некоторые данные, которые связаны с этой записью, и выполнить с ними некоторые процессы. Достаточно ли быстрое нахождение на карте, чтобы не использовать хеш-карты для этого примера? Записи имеют класс в качестве своей структуры, и я ничего раньше не делал с использованием карты или хэш-карты, у которой в качестве значения есть класс (если это возможно).
Заранее спасибо, ребята.
Отредактировано:
Сейчас мне не нужно одновременно хранить все записи в памяти> Сначала мне нужно дать ей структуру, а затем извлечь данные из некоторых записей. Общее количество записей составляет около 20 миллионов, и я хочу прочитать каждую из этих необработанных записей, а затем, если ее базовая информация не существует на моей новой карте или векторе, который я хочу создать, и поместить остальные данные туда как вектор. Поскольку у меня есть 20 миллионов записей, я думаю, было бы очень мучительно, если бы каждая запись прошла через 4 миллиона записей, чтобы найти, существует ли базовая информация об этой записи или нет. У меня около 4 миллионов типов пакетов, и каждый из этих пакетов может иметь более одного типа услуг (примерно 5 (20/4) на пакет). Я хочу прочитать каждую из этих записей, а затем, если идентификатор пакета не существует в векторе или что-либо еще, что я хочу использовать, и вставить основную информацию в вектор, а затем сохранить сервисы, связанные с этим пакетом, в векторе внутри класса упаковки.
Эти три структуры данных имеют разные цели.
vector
в основном динамический массив, который хорош для индексированных значений.
map
является отсортированной структурой данных с O (log (n)) временем извлечения и вставки (реализовано с использованием сбалансированного двоичного дерева, обычно красно-черного). Это лучше, если вы не можете найти эффективный метод хеширования.
hash_map
использует хеши для получения объекта. Если у вас есть четко определенная хеш-функция с низкой частотой столкновений, вы получите постоянное время поиска и вставки в среднем. hash_map
с, как правило, быстрее, чем map
но не всегда. Это сильно зависит от хэш-функции.
Для вашего примера, я думаю, что лучше всего использовать hash_map
где ключом будет номер записи (при условии, что номера записей уникальны).
Если эти номера записей плотные (то есть между индексами нет или почти нет пропусков)
, скажем: 1,2,4,5,8,9,10 …), вы можете использовать vector
, Если ваши записи поступают из базы данных с первичным ключом автоинкремента и не большим количеством удалений, это обычно имеет место.
Других решений пока нет …