YaniDizilim dizinim neden bu algoritmada sınırlar dışı?
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static int[,] GetPairs (int [] arr)
{
// given an array arr of unique integers, returns all the pairs
// e.g. GetPairs(new int [] { 1, 2, 3, 4, 5 }) would return
// { {1, 2}, {1, 3}, {1, 4}, {1, 5}, {2, 3}, {2, 4}, {2, 5}, {3, 4}, {3, 5}, {4, 5} }
int n = (arr.Length * (arr.Length - 1))/2; // number of pairs unique pairs in an array of unique ints
if (n < 1) return new int[0,2] {}; // if array is empty or length 1
int[,] pairs = new int[n,2]; // array to store unique pairs
// populate the pairs array:
for (int i = 0, j = 0; i < arr.Length; ++i)
{
for (int k = i + 1; k < arr.Length; ++k)
{
pairs[j,0] = arr[i];
pairs[j,1] = arr[k];
++j;
}
}
return pairs;
}
public static void Main()
{
int [] OneThroughFour = new int [4] { 1, 2, 3, 4 };
int [,] Pairs = GetPairs(OneThroughFour);
for (int i = 0; i < Pairs.Length; ++i)
{
Console.WriteLine("{0},{1}",Pairs[i,0],Pairs[i,1]);
}
}
}
aşağıda yorumladı kodda kendini açıklayıcı ve ben alıyorum hatadır biraz pratik olduğu yapıyorum [System.IndexOutOfRangeException
: Endeksi dışında dizinin sınırları.]
döngüde
for (int i = 0; i < Pairs.Length; ++i)
{
Console.WriteLine("{0},{1}",Pairs[i,0],Pairs[i,1]);
}
bana hiç mantıklı gelmiyor. Sınır dışı nedir? Şüphesiz, 0
, 1
, ..., Pairs.Length - 1
aralığındadır. Kesinlikle geçerli olmayan indeksler için, 0
veya 1
.
Ayrıca, bunu O(n^2)
'dan daha iyi yapmak mümkün mü ve daha basit ve verimli bir şekilde .NET ile bir yolu var mı?
'Pairs.Length' birinci boyutun uzunluğu değildir. İki boyutun uzunluklarının çarpımıdır. –
için deneyin (int i = 0; i <= Pairs.GetUpperBound (0); ++ i) ' –