Структура данных для обработки списка из 3 целых чисел

0

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

Теперь я думаю о хорошей структуре для обработки этих циклов. они в основном представляют собой список ребер, поэтому мне понадобится нечто вроде массива 3d-целых векторов, причем каждое ребро определяется тремя координатами в моей текущей параметризации. Я уже думаю о создании класса вокруг этого объекта "списка", поскольку мне понадобятся методы вычисления диаметра циклы и, возможно, больше в будущем.

Но я определенно не настолько осведомлен о выборе структуры, которую я должен сделать, мой физический фон не научил меня достаточно в C++. И поэтому я хотел бы услышать ваше предложение по формированию этого фрагмента кода. Мне бы очень понравилось открывать новые способы кодирования этого ребенка.

Теги:
data-structures

1 ответ

1
Лучший ответ

Вы хотите две разные вещи. Один отслеживании всех ребер и позволяет быстрый поиск краевых объектов по индексу (интермедиат, Int, Int) (вероятно, вы не хотите int есть, но что - то вроде size_t или так). Это полностью не зависит от вашей второй цели, разбивающей упорядоченные подмножества.

Общая коллекция (1)

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

Насколько это легко, зависит от ожидаемого размера отдельных целых чисел. То есть у вас может быть не более 21 бит на целое число (например, если ваши целые числа являются short int значениями short int, которые имеют только 16 бит), тогда вы можете объединить их в одно 64-битное значение, которое уже имеет std::hash реализация std::hash. В противном случае, вам придется реализовать свой собственный хэш - специализацию, например, std::hash<std::array<uint32_t,3>> (который также довольно легко, и очень наращиваемых).

Как только вы можете хэшировать свой ключ, вы можете выбросить его в std::unordered_map и сделать с ним. Это быстро.

Обнаружение циклы (2)

Затем вы хотите иметь недолговечные структуры данных для идентификации циклов, поэтому вам нужна структура данных, которая распространяется на одном конце, но никогда на другом. Это означает, что вы, вероятно, хорошо работаете с std::vector или, возможно, с std::deque если у вас очень большие экземпляры (но сначала попробуйте вектор!).

Я бы предложил просто сохранить индекс в краю в локальном векторе. Вы всегда можете найти краевой объект в unordered_map. Тогда вопрос заключается в том, как представить индекс. Если Int представляет ваш целочисленный тип (например, int, size_t, short ,...), он, вероятно, наиболее последователен для использования std::array<Int,3> ---, если типы целых чисел отличаются, вы захотите std::tuple<...>.

  • 0
    Действительно, мне нужно иметь возможность итерировать и добавлять ребра, пока я строю цикл, пока не получим ответный удар по первому ребру (меня интересуют только замкнутые циклы). Самым удобным для меня является создание массива циклов (экземпляров класса). Каждый цикл нуждается в одной из этих итеративных структур для построения своей геометрии. Кроме того, пока я не собрал все возможные циклы, я не знаю, сколько их там, поэтому мне нужно, чтобы мой массив циклов был расходуемым / «итеративным».
  • 0
    Я не уверен, что действительно все это правильно разбираю. Но, похоже, я предложил тебе не то. Итак, вы хотите коллекцию краевых объектов, которую вы идентифицируете кортежем из трех целых чисел, и вам нужно, чтобы коллекция была упорядочена. Это предположение верно? Тогда я мог бы обновить ответ с лучшим предложением.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню