Что такое быстрая матрица или двумерный массив для хранения матрицы смежности в С++

Я пытаюсь вывести цепь Маркова процесса, который я могу только смоделировать. Количество состояний/вершин, которые будет содержать окончательный граф, очень велико, но я не знаю заранее количество вершин.

Прямо сейчас у меня есть следующее:

  • Мое моделирование выводит boost::dynamic_bitset, содержащее 112 бит, каждый временной шаг.
  • Я использую набор битов в качестве ключа в Google Sparse Hash для сопоставления с целочисленным значением, которое можно использовать в качестве индекса для матрицы смежности, которую я хочу построить.

Теперь мне нужна хорошая/быстрая матрица или двумерный массив для хранения целых чисел. Должно:

  • Используйте целочисленные значения, которые я сохранил в Google Sparse Hash, в качестве номеров строк/столбцов. (Например, я хочу получить доступ/изменить сохраненное целое число, выполнив что-то вроде matrix(3,4) = 3.
  • Я заранее не знаю, сколько строк или столбцов мне понадобится. Таким образом, он должен иметь возможность просто добавлять строки и столбцы на лету.
  • Большинство значений будут равны 0, поэтому, вероятно, это должна быть разреженная реализация чего-либо.
  • Количество строк и столбцов будет очень большим, поэтому это должно быть очень быстро.
  • Простой в использовании. Мне не нужно много математических операций, это должен быть просто быстрый и простой способ хранения и доступа к целым числам.

Надеюсь, я достаточно ясно изложил свой вопрос.


person jlmr    schedule 29.10.2013    source источник


Ответы (1)


Я бы рекомендовал http://www.boost.org/doc/libs/1_54_0/libs/numeric/ublas/doc/matrix_sparse.htm — повысить разреженные матрицы UBLAS. Существует несколько различных реализаций хранилищ разреженных матриц, поэтому чтение документации может помочь вам выбрать тип, подходящий для ваших целей. (TLDR: разреженные матрицы имеют либо быстрый поиск, либо быструю вставку.)

person Sven    schedule 29.10.2013
comment
Попробовал буст разреженной матрицы. Однако похоже, что функция resize() при сохранении данных еще не реализована в библиотеке Boost. (Или я не могу заставить его работать, что всегда можно рассмотреть.) Без функции resize() у меня проблемы, потому что количество необходимых мне записей непредсказуемо. - person jlmr; 29.10.2013
comment
Спросите в списке рассылки. Разработчики могут и ответят на ваш вопрос, они очень вежливые люди. Алгоритмически вы можете использовать unordered_map из unordered_maps для хранения ваших данных: unordered_map‹int,unordered_map*› верхнего уровня для моделирования первого измерения и unordered_map‹int,int› для хранения ваших целых чисел. (YMMV, спонтанные мысли... ;) - person Sven; 29.10.2013