C言語-配列内の各要素の頻度を計算します

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回トラバースし、値に変更があるたびにこの数値の統計を完了します。

実装コードは省略されています。




おすすめ

転載: blog.csdn.net/lx1848/article/details/52817802
おすすめ