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 요소의 빈도를 세 었다는 의미입니다. ].
  • 0에서 N-1까지 InputArray를 반복하고 각 요소의 주파수를 계산합니다.
  • 현재 요소 inputArray [i]에 대해 countArray [i] == -1이면이 요소의 빈도를 countArray [i]에 저장합니다. 그렇지 않으면 이전에 계산되었으므로 저장하지 않습니다.

일반적인 프로세스는 다음 그림으로 나타낼 수 있습니다.


통계 배열 의 모든 요소의 초기 값은 -1입니다. 통계 프로세스 중에 이러한 요소는 세 가지 유형의 값을 가질 수 있으며, 이는 각각 계산할 배열 에서 해당 요소의 세 가지 상태를 나타냅니다 : 계산되지 않음 (-1 ), 개수 (0), 발생 빈도 (0이 아님, -1이 아님).

최악의 시간 복잡도 : O (n ^ 2), 즉 각 요소가 한 번만 나타납니다. 공간 복잡도 : 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 정렬 된 배열을 한 번 순회하고 값이 변경 될 때마다이 숫자의 통계를 완료합니다.

구현 코드가 생략되었습니다.




추천

출처blog.csdn.net/lx1848/article/details/52817802