Каков наилучший способ создания разреженного массива в C ++? - PullRequest
47 голосов
/ 07 августа 2008

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

Короче говоря, мне нужно отслеживать относительно небольшое количество значений (обычно значение 1, а в редких случаях более 1) в море нулей в матрице (многомерный массив).

Разреженный массив позволяет пользователю хранить небольшое количество значений и считать все неопределенные записи заданным значением. Поскольку физически невозможно хранить все значения в памяти, мне нужно хранить только несколько ненулевых элементов. Это может быть несколько миллионов записей.

Скорость является огромным приоритетом, и я также хотел бы динамически выбирать количество переменных в классе во время выполнения.

В настоящее время я работаю в системе, которая использует двоичное дерево поиска (b-дерево) для хранения записей. Кто-нибудь знает о лучшей системе?

Ответы [ 11 ]

0 голосов
/ 27 сентября 2009

Так как только значения с [a] [b] [c] ... [w] [x] [y] [z] имеют значение, мы храним только индекс самостоятельно, а не значение 1, которое составляет примерно везде - всегда одинаково + нет способа хешировать это. Отметив, что проклятие размерности присутствует, предложите пойти с каким-то установленным инструментом NIST или Boost, хотя бы прочитайте источники для этого, чтобы обойти ненужную ошибку.

Если в работе необходимо уловить распределения временной зависимости и параметрические тенденции неизвестных наборов данных, то карта или B-дерево с однозначным корнем, вероятно, не практичны. Мы можем хранить только сами индексы, хэшированные, если порядок (чувствительность для представления) может подчиняться сокращению временной области во время выполнения для всех 1 значений. Поскольку ненулевые значения, отличные от единицы, немногочисленны, очевидным кандидатом для них является любая структура данных, которую вы можете легко найти и понять. Если набор данных действительно огромного размера, я предлагаю какое-то скользящее окно, которое самостоятельно управляет файлом / диском / persistent-io, перемещая части данных в область по мере необходимости. (написание кода, который вы можете понять) Если вы обязуетесь предоставить реальное решение для рабочей группы, то неспособность сделать это оставляет вас во власти операционных систем потребительского уровня, которые преследуют единственную цель отобрать у вас обед.

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