Каковы некоторые из наиболее эффективных способов хранения grid-подобной структуры в c ++?

Предположим, у меня было несколько NxN-сеток, и я хотел манипулировать определенными местами в них на основе некоторых команд. Какие из наиболее эффективных способов я могу сделать на C ++?

Чтобы сделать все более ясным, подумайте, что у меня есть следующий файл:

world.txt:

2 O O
O O O
X O X
-----
X O X
O O O
1 O O

Что представляет собой две сетки 3х3. Предположим также, что для ясности (но это не имеет большого значения) моя задача состояла в том, чтобы реализовать алгоритм, который печатает местоположения, сделанные для получения от 1 до 2 (используя любой маршрут). Каков наиболее эффективный способ хранения таких данных на C ++ и действовать в отдельных местах на основе некоторых правил? Какие структуры данных хороши при работе с данными, имеющими эту форму?

0
nl ja de
Что такое эффективный для вас? Эффективно? Быстро для вашего использования? Быстро для набора usecases?
добавлено автор Matthieu M., источник
Если я должен это сделать, я бы разработал собственный класс «grid», используя простой массив.
добавлено автор Dídac Pérez Parera, источник
Эффективно с точки зрения времени выполнения (т. Е. Выполняется быстрее всего не более 50 NxN-сеток).
добавлено автор Bob John, источник
@ArneMertz затем рассмотрит 40 сеток 1000x1000 ...
добавлено автор Bob John, источник
Да, конкретные места нужно заменить чем-то другим.
добавлено автор Bob John, источник
Хорошо, тогда предположим, что я хотел найти кратчайший маршрут от 1 до 2, заменив мой путь Hs.
добавлено автор Bob John, источник
... эффективный в памяти, эффективный для вставки/удаления, ....
добавлено автор Ed Heal, источник
Это зависит. О том, сколько объектов есть в сетке, по сравнению с размером сетки. И на сколько разных объектов есть. И, конечно, это зависит от размера сетки, если эффективность имеет значение вообще. Для сетки 3х3 я даже не стал бы беспокоиться.
добавлено автор Arne Mertz, источник
Какие операции вы должны выполнять в этой сетке? Всегда ли это четырехугольник (т. Е. Структурированная сетка) или он может быть неструктурирован? Треугольники? Произвольные формы? Если это проблема графа, используйте специальную библиотеку, например Boost.Graph .
добавлено автор Michael Wild, источник
Может быть, он разрежен? Вам нужна быстрая вставка/удаление строк/столбцов?
добавлено автор Alexey Frunze, источник
Вместо того, чтобы искать наилучшее представление сетки, рассмотрите сначала поиск эффективного алгоритма для решения проблемы. Может быть, вы найдете хороший алгоритм подходящего графика для этой проблемы, тогда вам нужно будет преобразовать сетку в структуру графика.
добавлено автор Christian Ammer, источник
Выбор правильной структуры данных сильно зависит от того, что вам нужно делать с этой структурой данных, поэтому имеет значение алгоритм . Это также зависит от того, что хранится в структуре данных, и сколько и ... Другими словами - если вы хотите создать эффективную структуру данных для своих целей, вам нужно будет более четко узнать, что ваши цели - и если вы еще не знаете, тогда любой выбор, который вы делаете, должен быть достаточно хорошим.
добавлено автор Sander De Dycker, источник

1 ответы

Для эффективности пространства или скорости доступа (или почти ничего другого) вы не собираетесь бить 2D-массив. То, что более сложная структура предоставит вам, - это более интуитивное представление проблемы за счет некоторого пространства или скорости.

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


Для чего-то простого, как это, я бы придерживался массива. Но это личное предпочтение. Я могу видеть, как, если бы вы пошли на что-то более подробное, графическое представление было бы лучше. (Плюс он лучше обобщает произвольные конфигурации.)

0
добавлено
Я также хотел бы отметить, что для скорости доступа вам нужно получить сетку правильно в памяти. Если вы выделяете каждую строку отдельно, вы хотите пройти по каждой строке, не пересекая каждый столбец, а затем увеличивая число столбцов. Это намного лучше выравнивает в кеше, предотвращает ложное выселение строк из кеша и намного лучше работает с предварительной выборкой.
добавлено автор slugonamission, источник
Правда. Проблемы с графикой, хотя обычно влекут за собой довольно произвольный доступ к узлам, и для размеров проблем, о которых он упоминает (50x50), все равно будет в L1 в любом случае. Если вы действительно были мазохистскими (или действительно анальными в отношении местоположения кэш-памяти), попробуйте пройти в порядке Мортона: en.wikipedia.org/wiki/Z-order_ (кривая)
добавлено автор sheu, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest