2016-03-28 19 views
0

配列全体の反復量を最適化するタスクがあります。最適化配列操作

Iは、ソース配列を有する:0-NO特徴、1

int[] dataArray = new int[10] {0, 1, 1, 1, 0, 0, 0, 0, 1, 0}; 

- 機能存在します。 この

public struct MyDataStruct 
{ 
    public int Index; //index in array 
    public int Value; //some value 
} 

はまた、いくつかの機能のreprezentationの2つの方法があります。理想的に私はONLY OptimizedKeyValueArray1を使用するとNotOptimizedKeyValueArray1のすべてusingsを削除する必要があります。私はresultArray、inputArrayと同じ量を持っている必要があり、結果として

public static readonly MyDataStruct[] NotOptimizedKeyValueArray1 = 
     { 
       new MyDataStruct(0, -1), 
       new MyDataStruct(1, 1000), 
       new MyDataStruct(2, 2500), 
       new MyDataStruct(3, 4500), 
       new MyDataStruct(4, -1), 
       new MyDataStruct(5, -1), 
       new MyDataStruct(6, -1), 
       new MyDataStruct(7, -1), 
       new MyDataStruct(8, 6500), 
       new MyDataStruct(9, -1) 
     }; 

public static readonly MyDataStruct[] OptimizedKeyValueArray1 = 
     { 
       new MyDataStruct(1, 1000), 
       new MyDataStruct(2, 2500), 
       new MyDataStruct(3, 4500), 
       new MyDataStruct(8, 6500) 
     }; 

int[] inputArray = new int[10] {0, 1, 1, 1, 0, 0, 0, 0, 1, 0}; 

MyDataStruct[] resultDataSet = new MyDataStruct[10]; 

これは、このタスクの私の解決策ですが、私は反復処理ですので、それは、スケーラブルで最適化されていないされていません私のために重要ではない要素については、私は非常に最初からそれについて知っています。結果として、私は10要素を持っています:

for(int i = 0; i < dataArray.Length; i++) 
{ 
    resultDataSet[i] = new MyDataStruct(i, dataArray[i]); 
} 

しかし、私はそれをより効率的にする必要がありますし、0値の要素を反復処理する必要はありません。しかし、このコードでは、4つの要素しか作成しませんが、他の6つの要素にはデフォルト値を設定する必要があります。そして私はそれをより効率的に行う方法を知らない。

for(int i = 0; i < OptimizedKeyValueArray1.Length; i++) 
{ 
    int index = OptimizedKeyValueArray1.Index; 
    int value = OptimizedKeyValueArray1.Value; 

    resultDataSet[i] = new MyDataStruct(i, dataArray[i]); 
} 

また、このタスクを実行するために、アレイ上でより効率的なアルゴリズムを提案することもできます。ありがとう。

+1

使用し、このLINQ文のint [] inputArray2 = inputArray.Where(項目=>項目== 1).ToArray() ;要件ごとに4つのアイテムしか得られず、ループを実行する – rashfmnb

+0

linqはありません。使用できません。 – yozhik

+0

この宿題はありますか?有効な値だけを反復処理したい場合は、配列をfeatureflagでソートする必要があります。その後、単純な終了条件である無効な機能にヒットするまで、配列を繰り返し処理できます。 –

答えて

1

あなたがNotOptimized配列または単に最適化されたものを使用したい場合、これはあなたが第一配列から要素を取ることができれば、私はそれを行うだろう方法です完全に、あなたは何を意味するかわからビット不明確ない:

const int arraySize = 10; 

//No need int[] if only 0 & 1 
bool[] dataArray = new bool[arraySize] {false, true, true, true, false, false, false, false, true, false}; 

List<MyDataStruct> resultDataSet = new List<MyDataStruct>(); 
//You must iterate on all dataArray, no real way around it 
for(int i = 0; i < arraySize; i++) 
{ 
    if (dataArray[i]) 
     resultDataSet.Add(NotOptimizedKeyValueArray1[i]); 
} 

あなたは、あなたが別の配列を使用すべき要素の数が同じでなければならない場合:

MyDataStruct[] resultDataSet = new MyDataStruct[arraySize]; 
for(int i = 0; i < arraySize; i++) 
{ 
    if (dataArray[i]) 
     resultDataSet[i] = NotOptimizedKeyValueArray1[i]; 
    else 
     resultDataSet[i] = new MyDataStruct(); //whatever your default is. 
} 
+0

しかし、このようにして、resultDataSetに4つの要素だけを値で取得します。そして、私は10をすべて持っている必要がありますが、そのうち6つはデフォルト値でなければなりません。 – yozhik

+0

Iveがmy anserを編集しました@yozhik –