[英]C#: Out of memory Exception
我已經編寫了一個控制台應用程序
Int64 sum = 0;
int T = Convert.ToInt32(Console.ReadLine());
Int64[] input = new Int64[T];
for (int i = 0; i < T; i++)
{
input[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < T; i++)
{
int[,] Matrix = new int[input[i], input[i]];
sum = 0;
for (int j = 0; j < input[i]; j++)
{
for (int k = 0; k < input[i]; k++)
{
Matrix[j, k] = Math.Abs(j - k);
sum += Matrix[j, k];
}
}
Console.WriteLine(sum);
}
當我輸入為
2
1
999999
它給出Out of memory exception
。 你能幫忙嗎?
查看您要分配的內容:
input[]
被分配為2個元素(16個字節)-不用擔心
但是隨后您輸入值: 1
和999999
並在循環的第一次迭代中嘗試分配
Matrix [1,1] = 4個字節-再也不用擔心,
但是您第二次嘗試分配
矩陣[999999,999999]
這是4 * 10e12字節,即使磁盤上有交換空間,也肯定超出了計算機的容量。
我懷疑這不是您真正想要分配的(無論如何,您永遠都無法填充或操縱那么多元素……)
如果您只是嘗試按照原始代碼進行計算,則無需分配或使用該數組,因為您只存儲一個值並立即使用該值,然后就不再使用它。
Int64 sum = 0;
int T = Convert.ToInt32(Console.ReadLine());
Int64[] input = new Int64[T];
for (int i = 0; i < T; i++)
input[i] = Convert.ToInt32(Console.ReadLine());
for (int i = 0; i < T; i++)
{
// int[,] Matrix = new int[input[i], input[i]];
sum = 0;
for (int j = 0; j < input[i]; j++)
for (int k = 0; k < input[i]; k++)
{
//Matrix[j, k] = Math.Abs(j - k);
//sum += Matrix[j, k];
sum += Math.Abs(j - k);
}
Console.WriteLine(sum);
}
但是現在要當心-一萬億美元將永遠需要計算-它不會轟炸,但是您可能想要休假,結婚並生孩子,然后才能預期結果。
當然,您可以執行以下方法來求和:
for (int i = 0; i < T; i++)
{
sum = 0;
for (int j = 1, term = 0; j < input[i]; j++)
{
term += j;
sum += term * 2;
}
Console.WriteLine(sum);
}
所以現在的計算是O(n)而不是O(n ^ 2)
而且,如果您需要知道Matrix[x,y]
的值,可以使用簡單表達式Math.Abs(x - y)
因此無需存儲該值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.