2016-11-20 3 views
0

Я реализовал algorithm, который печатает все положительные целочисленные решения в уравнении a^3 + b^3 = c^3 + d^3, где a, b, c, d являются целыми числами от 1 до 1000. Для этого я использовал hash table, чтобы отбросить complexity до O(N2). H = c^3 + d^3Почему я получаю ошибку дампа ядра с моей хэш-таблицей, когда она превышает определенный размер?

Ниже hash table, что я использовал (список пар целых чисел):

int n = 10; 
int m = pow(n,3)+pow(n,3); 
list< pair<int,int> > hashTable[m+1]; //(*) Core Dump here if n>50. Why? 

Мой код работает правильно, когда п < = 50. Но я не могу запустить свой algorithm для n> 50. Таким образом, я не могу решить проблему для n = 1000. Я получаю базовый дамп в строке (*). Можете ли вы объяснить, почему это происходит, и помочь мне лучше реализовать свой hash table?

Благодарим вас за внимание!

+1

На каком языке это написано? – ItamarG3

ответ

0

Проблема заключается в том, что вы попытались выделить массив hashTable на стек, который имеет ограничения по размеру (по умолчанию несколько мегабайт). При n = 50 и sizeof(std::list<std::pair<int, int> >) = 16 размер требуемой памяти составляет всего 2 МБ. Чем больше - и у вас заканчивается размер стека.

Чтобы исправить это, выделите массив hashTable динамически или используйте std::unordered_set вместо реализации собственной хеш-таблицы.

+0

Когда вы используете метод 'push_back()', я думаю, что мы распределяем память динамически. Я не понимаю вашего ответа. Не могли бы вы быть более конкретными? ** Примечание: я заменил 'list' на' vector', но он тоже не работал. – Zimo

+0

Сам объект списка выделяется в стеке (он содержит указатели на первый и последний узлы), узлы распределяются в динамической памяти. Существует достаточно стека для 250K таких списков (n = 50), но недостаточно для списков 2M (n = 100). Вам нужно создать объекты списка также в динамической памяти, например, заменив массив вектором: std :: vector >> hashTable (m + 1); ' – gudok

+0

Спасибо. Он работал с вектором вектора пар. Я могу выделить больший размер памяти, но есть предел. У меня есть 'bad_aloc', если я пытаюсь создать вектор размером 2 * 1000^3 – Zimo

 Смежные вопросы

  • Нет связанных вопросов^_^