2016-03-20 20 views
3

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ı?

+0

'Pairs.Length' birinci boyutun uzunluğu değildir. İki boyutun uzunluklarının çarpımıdır. –

+0

için deneyin (int i = 0; i <= Pairs.GetUpperBound (0); ++ i) ' –

cevap

4

İki boyutlu diziler için Length özelliği, ikinci boyutun uzunluğuyla çarpılan birinci boyutun uzunluğunu döndürür. Sizin durumunuzda, bu, ilk boyutta döngü yapmak olduğunu söyleyebildiğim kadarıyla, istediğiniz kadar eşittir.

böyle GetUpperBound yöntemi kullanın:

for (int i = Pairs.GetLowerBound(0); i <= Pairs.GetUpperBound(0); ++i) 
{ 
    //... 
} 
+0

İyi lekelenme, Yacoub. –

+0

Teşekkürler @QualityCatalyst –

+0

Biraz tutarsız. 'I = GetLowerBound (0)' ı kullanın; i <= GetUpperBound (0); ... 'veya' i = 0; I

İlgili konular