Большие тестовые случаи с графами на C++ (с использованием STL) выдают std::bad_alloc

Мы работаем над реализацией алгоритма графа (хранящегося как реализация списка смежности), который требует от нас сохранения следующего:

  1. Двумерная n в n матрица расстояний (хранится в виде массива с плавающей запятой)
  2. Количество кратчайших путей между каждой парой вершин (хранится в виде массива целых чисел).
  3. Предшественники для каждой вершины, принимающей данную вершину в качестве исходной, для всех возможных вариантов исходной. Это O (n * n * k), где k - среднее количество предшественников для всех вершин по всем возможным выборам исходной вершины. В худшем случае это может быть пространство до O (n ^ 3). Однако среднее количество предшественников, вероятно, будет небольшим (k — константа). Предшественник хранится в виде двухуровневой карты, а список предшественников хранится в виде вектора STL.

Мы пробовали тестировать на больших графах (> 2 ^ 12 вершин), и это выдает std::bad_alloc после запуска в течение некоторого времени. Это происходит даже при работе на 8 ГБ (Ubuntu 12.04) или 16 ГБ с использованием только 3 ГБ памяти. Не могли бы вы рассказать, как мы можем заставить работать большие тестовые случаи, или мы где-то ошибаемся?


person Aritra Ghosh    schedule 18.03.2014    source источник
comment
Вы используете 64-битную ОС и компилируете в 64-битный исполняемый файл?   -  person Messa    schedule 18.03.2014
comment
Вы не предоставили достаточно информации. Что вызывает std::bad_alloc? Используете ли вы resize, reserve или shrink_to_fit для управления емкостью std::vector? Если позволить ему автоматически увеличиваться, вы можете зарезервировать почти вдвое больше ресурсов, чем вы фактически используете. Является ли карта лучшим выбором структуры данных? Указатели между узлами могут занимать много места.   -  person Jonathan Wakely    schedule 18.03.2014
comment
Указатели между узлами могут занимать много места. Не могли бы вы немного уточнить? Мы использовали карты, так как для поиска требуется O(1). Какую структуру данных вы бы предложили для предшественников? Для исходной вершины мы сохраняем только вектор предшественников predecs[s][t], и каждый ключ t может не существовать для данной исходной вершины s.   -  person Aritra Ghosh    schedule 29.03.2014


Ответы (1)


Попробуйте скомпилировать свой код в 64-битном режиме в 64-битной операционной системе.

person Mr.C64    schedule 18.03.2014
comment
Я использовал 64-битную операционную систему и скомпилировал в 64-битном режиме. При вводе файла /usr/bin/gedit /usr/bin/gedit: 64-битный исполняемый файл ELF LSB, x86-64, версия 1 (SYSV), динамически связанный (использует общие библиотеки), для GNU/Linux 2.6.24, Я делаю это правильно? - person Aritra Ghosh; 29.03.2014