2011-08-24 17 views
5

Argh aracılığıyla endeksi çözmek için algoritma ile yardıma ihtiyacınız var! Bunu sonunda alacağımı biliyorum ama bu noktada neredeyse 2 saatim var ve hala takıldım.pürüzlü dizide

Belirli bir konum için tırtıklı dizinin her bir "level" bireysel endeksleri çözmek gerekir. Açıklamak zor, ama [2,3,4] uzunlukları olan 3 seviyeli bir pürüzlü dizi hayal edin. Eğer daha sonra tek diziye o doğrulmak olsaydı o Diyelim ki tek dizi indeksi eşit olacağını (pürüzlü dizinin her seviye için bir tane) endeksleri bulmak için gerekli diyelim, Şimdi 24'e bir büyüklüğe sahip olacaktır 22. 1,2,1 olacaktır. Tek bir senaryoyu anlamak zor değil, ama değişken derinlikli pürüzlü bir dizi için bu değerleri çözmek için algoritmanın ne olduğunu bulmaya çalışıyorum. o NEREDEYSE ihtiyacım olanı beni alır ama sadece şans olabileceğini düşünmek rağmen,

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     // Build up the data and info about level depth 
     int[] levelDepth = new[] { 2, 3, 4 }; 
     int[][][] data = new int[][][] 
     { 
      new int[][] { new int[4], new int[4], new int[4] }, 
      new int[][] { new int[4], new int[4], new int[4] } 
     }; 

     int requestedValue = 22; 
     float temp = requestedValue; 

     // Store the index of each level array to get to the index 
     // for the requested value 
     int[] levelIndexes = new int[3] { 0, 0, 0 }; 

     // The following does not work! 
     int i = levelDepth.Length; 
     while (i > 0) 
     { 
      temp = temp/levelDepth[i - 1]; 
      levelIndexes[i - 1] = (int)Math.Round(temp); 

      i--; 
     } 
    } 
} 

O düzgün çalışmıyor: İşte

benim şimdiki girişimi basit bir kod örneğidir. Bunun daha önce çözüldüğü ortak bir sorun olduğundan şüpheleniyorum, bunu çözme deneyimim yok. :(

Ayrıca, kimsenin bana bu gibi dizileri kullanmanın korkunç olduğunu veya "neden bu şekilde verilerinizi saklamaması gerektiğini" söylemeden önce - Yukarıdaki açıklama ve kod, donanımımızdaki bazı dekoder yongalarının düzenini simüle ediyor ve Basamaklı çiplerin belirli bir grafiğine giden bir yolu çözmek için bir yol bulmam gerekiyor, yukarıdaki örnek tam olarak çiplerin yerleşimi ile eşleşiyor.Buna takılıyorum ..

+0

Gerçek indislere mi, yoksa sadece o andaki elemanın değerine mi ihtiyacınız var? – drharris

+0

@drharris - endeksleri –

cevap

3

float s özelliğini kullanmamalısınız.

int[] levelDepth = new[] { 2, 3, 4 }; 
int requestedValue = 22; 
int[] levelIndexes = new int[levelDepth.Length]; 


for (int i = 0; i < levelDepth.Length; i++) 
{ 
    // need to go from { 2, 3, 4 } -> { 3*4, 4, 1 } 
    int f = 1; 
    for (int j = i+1; j < levelDepth.Length; j++)  
    f *= levelDepth[j]; 

    levelIndexes[i] = requestedValue/f; // integer divide 
    requestedValue = requestedValue % f; 
} 
+0

Modulo! - bu benim eksik olduğum şey (tamam, belki de birkaç parça daha) Çözümünüz iyi çalışıyor ve önemli olan derinlikli grafikleri dinamik olarak ele alacaktır. Şamandıra kullanımını da severim, bu da beni rahatsız ediyor. –

+0

Sadece bir not, pürüzlü görünmüyor (dizi dizisi). int [,,] data = new int [2,3,4]; '' getLength (level) '' levelDepth [] 'yerine geçebilirdi. –

+0

Bu algoritma bir ders kitabında mı? Sorunumu çözdü, ancak bir referans bulmak için uğraştım (bu cevaba izin vermekten başka). – Jon

1

Bu noktada öğenin değerine ihtiyacınız olduğunu varsayarsak (ve belirli endeksleri değil), basitçe bir yakut benzeri flatten yapabilir ve daha sonra dizine doğrudan erişebilirsiniz.

Düzenleme: Yanlış anlaşılma için özür dilerim, belki bu yardımcı olacaktır. m Microsoft Visual C# .NET 2003 Geliştiriciler Cookbook (Mark Schmidt): 2 uzunluğunda

static int[] GetDimensionIndices(int flatIndex, Array array) 
{ 
    int[] indices = new int[array.Rank]; 
    int p = 1; 
    for(int i = array.Rank - 1; i >= 0; i--) 
    { 
     indices[i] = (((flatIndex/p)) % (array.GetUpperBound(i)+1)); 

     if(i > 0) 
      p *= array.GetUpperBound(i) + 1; 
    } 
    return indices; 
} 
+0

ilk mesajda açık değildi Maalesef; Ben indeksleri ihtiyacım –

+0

Ben bir kitapta buldum potansiyel bir çözüm ile benim cevap güncelledik. – drharris

+0

Bu da ilginç bir çözüm, eğer iki cevap seçebilseydim. Numuneyi gönderdiğiniz için teşekkürler! –

1

Dizi, 4.

Böylece ilk dizisinde endeksi uzunluğunun dizi tutar uzunluğunun 3 dizisi, tutar toplam endeksi 3 * 4 = 12 artırır. İkinci dizi

Ana yüzden 1.

, 22 = 12 x 1 + 4 * 2 + 1 * 1 göre toplam artırır üçüncü dizi 4.

Index göre toplam artırır.

Bu sayıları bulduktan sonra (levelDepth'daki değerleri çoğaltın), en dıştaki diziden başlayarak açgözlü bir algoritma kullanabilirsiniz.

int temp = requestedValue; 
int levelWeight[] = {levelDepth[2]*levelDepth[1], levelDepth[2], 1}; 
for(int i=0;i<3;i++){ 
    while(requestedValue >= levelWeight[i]){ 
     levelIndexes[i]++; 
     requestedValue-=levelWeight[i]; 
    } 
} 
+0

örnek için teşekkürler. Tempoyu azaltmak için bir eksiklik olduğunu düşünüyorum (örneğin temp - = levelWeight [i]).Ayrıca son indeks 1 –

+0

yerine 2 yerine hatalı olarak çözüldü Aslında, son dizin yorumunda hatalıyım; 2, doğru değer –