2016-11-20 34 views
0

我实现了一个algorithm,它打印所有正整数解方程a^3 + b^3 = c^3 + d^3其中a,b,c,d是介于1和1000之间的整数。 为此,我使用hash tablecomplexity删除为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,所需的内存大小只有2MB。比这更大 - 并且您的堆栈大小不足。

要修复它,动态分配hashTable数组或使用std::unordered_set而不是实现您自己的散列表。

+0

当你使用'push_back()'方法时,我想我们动态地分配内存。我不明白你的答案。你可以请更具体吗? **注意:我用'vector'替换了'list',但它也没有工作。 – Zimo

+0

列表对象本身在堆栈上分配(它包含指向第一个和最后一个节点的指针),节点分配在动态内存中。 250K这样的列表(n = 50)有足够的堆栈,但对于2M列表(n = 100)不够。您还需要在动态内存中创建列表对象,例如通过将数组替换为向量:'std :: vector >> hashTable(m + 1);' – gudok

+0

谢谢。它与成对矢量矢量一起工作。我可以分配更大的内存大小,但是有一个限制。如果我尝试创建大小为2 * 1000的矢量,我有'bad_aloc' 3 – Zimo

相关问题