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 정렬 된 배열을 한 번 순회하고 값이 변경 될 때마다이 숫자의 통계를 완료합니다.
구현 코드가 생략되었습니다.