Предложения по реализации разреженного вектора без использования сторонних библиотек

Мне приходится использовать разреженный вектор для некоторых вещей в моем текущем проекте. Но, поскольку я не отвечаю за проект, я не могу использовать любые внешние библиотеки, которые захочу. У меня есть только STL и OpenCV.

Я просмотрел несколько ответов на вопросы stackoverflow, но они либо сосредоточены на конкретном подходе, сравнение ограниченного числа подходов (2) и внешних библиотек, когда речь идет конкретно с разреженными векторами. Есть также несколько отличных идей для реализации разреженной матрицы.

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

  • адаптацию OpenCVреализации SparseMatк моим потребностям
  • с использованием std::mapдля хранения значений (или, возможно, сделать очень простую оболочку, которая вернет значение по умолчанию в случае индексации нулевого элемента)
  • с использованием std::vector >где Я мог бы хранить индекс и данные в элементах std::pair

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


Использование в моем конкретном случае следующее:

  • вектор, скорее всего, не будет изменен после его создания (сейчас я не вижу в этом необходимости, но я не могу гарантировать 100%, что это не появится)
  • ожидается, что наиболее распространенной операцией будет скалярное произведениедвух таких векторов (то есть более или менее доступ к элементам линейным последовательным способом)
  • только поиск Я могу предвидеть, что прямо сейчас (возможно) проверяется погода, является ли определенный элемент нулевым элементом или нет
  • ожидается около 500 ненулевых элементов
  • короче говоря, большую часть времени будет использоваться разреженный вектор как математическое понятие вектора(многомерной точки) без особой необходимости исследовать каждую координату отдельно

. цель Реализация разреженного вектора.

5
задан Community 23 May 2017 в 12:07
поделиться