私は次のような配列を持っています
uint32_t arr1[] = {2, 34, 78, 5, 10, 100};
ここで、
arr1[0]
範囲の数を示します。つまり、上記の例には
34 to 78
の2つの範囲があります。および
5 to 10
および
100
個々の値です。
私はこの配列から最大値と最小値を効率的な方法で見つけたいです、arr1では最大値は
100
です最小値は
5
です
。
私は次のようにしていました:
max = arr1[1];
min = arr1[1];
int len = sizeof(arr1)/sizeof(arr1[0]);
for(int i = 2; i < len; i++){
if(arr[i] < min)
min = arr[i];
if(arr[i] > max)
max = arr[i];
}
別の例は
uint32_t arr2[] = {1, 18, 39, 2};
この例では、
18 to 39
の1つの範囲しかありません および
2
個々の値であるため、最小値は
2
です最大値は
39
です
もう一つの例は
uint32_t arr3[] = {0, 14, 5, 256, 99};
この例には範囲がないため、最小値は
5
です最大値は
256
です
配列内の異常なデータ構造により、ある程度の最適化が可能です。
arr[0]
で識別される範囲(値のペア)を扱っている間 、ペアの最初の要素を最小値に対して、2番目の要素を最大値に対してテストするだけです。範囲外の値を扱う場合、各要素を最小値と最大値の両方に対してチェックする必要があります。それは次のようなコードにつながります:
実行すると、出力が生成されます。
このより複雑なコードが実際に値をスキャンすることよりも効率を大幅に向上させるかどうかは(質問に示されているように)議論の余地があります-または測定可能ですが、測定には検出可能な配列内の非常に多くの要素が必要です。示されている配列サイズでは、本質的に測定可能な差はありません。