2016-11-20 36 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

相關問題