1.問題の説明:
合計N個の要素を持つ整数配列inputArrayがあるとします。各要素の頻度を数えたいと思います。
2.分析:
この問題の難しさは、各要素の現在の周波数値を保存することです。
たとえば、今一度登場した要素1、この状態を保存する方法は?この問題を解決した後、1に遭遇したときにこの状態を更新するだけで、他の要素にも同じことが言えます。
Javaを使用してこの問題を解決する場合、Javaの豊富なコンテナクラスが上記の問題の解決策であるHashMapを提供するため、非常に簡単になります。この要素をキーとして使用し、その出現頻度を値として使用するだけで済みます。
後で値を更新するだけで十分であり、効率は悪くありません。
しかし、C言語を使用して達成したい場合は、すべてを自分で手動で解決する必要があります。これもこのブログの目的です。
C言語ソリューションのアイデア:
- まず、inputArrayと同じサイズの配列countryArrayを宣言し、各要素の値を-1に初期化して、各要素の頻度を格納します。これには、パフォーマンスをあまり損なうことなくHashMapと同じ効果を達成するためのある程度のスキルが必要です。
- countArray [i] == -1の場合、要素inputArray [i]の頻度をカウントしていないことを意味します。countArray[i] == 0の場合、要素inputArray [i]の頻度をカウントしたことを意味します。 ]。
- InputArrayを0からN-1までループし、各要素の頻度をカウントします。
- 現在の要素inputArray [i]の場合、countArray [i] == -1の場合、この要素の頻度をcountArray [i]に保存します。それ以外の場合は、以前にカウントされているため、保存しません。
一般的なプロセスは、次の図で表すことができます。
統計配列のすべての要素の初期値は-1です。統計プロセス中、これらの要素には3種類の値があり、それぞれ、カウントされる配列内の対応する要素の3つの状態を表します。カウントされません(-1 )、カウント(0)、発生頻度(0ではなく、-1ではない)。
最悪の時間計算量:O(n ^ 2)、つまり、各要素は1回だけ表示されます。空間計算量:O(n)、これは統計配列のコストです。ここで、nはカウントされる要素の総数です。
コードは次のように表示されます。
/*
* C Program to count frequency of each Array element
*/
#include <stdio.h>
int main()
{
int inputArray[100], countArray[100];
int elementCount, i, j, count;
printf("Enter Number of Elements in Array\n");
scanf("%d", &elementCount);
printf("Enter %d numbers\n", elementCount);
/* Read array elements */
for(i = 0; i < elementCount; i++) {
scanf("%d", &inputArray[i]);
countArray[i] = -1;
}
/*
* for any element inputArray[i], If countArray[i] = -1,
* that means frequency is not counted for this number yet
* and countArray[i] = 0 means frequency is already
* counted for this number.
*/
for(i = 0; i < elementCount; i++) {
//开始统计inputArray[i]这个元素的出现频率
//至少出现1次
count = 1;
// 值为0表示该数字已经被统计过
if (countArray[i] == 0) {continue;}
for(j = i+1; j < elementCount; j++) {
if(inputArray[i]==inputArray[j]) {
countArray[j] = 0;
count++;
}
}
//记录inputArray[i]出现的频率
countArray[i] = count;
}
/* Print count of each element */
for(i = 0; i<elementCount; i++) {
if(countArray[i] != 0) {
printf("Element %d : Count %d\n", inputArray[i], countArray[i]);
}
}
return 0;
}
また、より速い方法を考えてください。
-1最初に統計配列を並べ替えます。複雑さが到達できる最速の時間:O(nlogn)
-2ソートされた配列を1回トラバースし、値に変更があるたびにこの数値の統計を完了します。
実装コードは省略されています。