竞赛编程中的频率测量技术


在本文中,我们将探讨查找数组[]中数字频率的不同方法。这些方法在解决不同情况下的各种竞赛编程问题时非常有用。有时,计算数组中出现的数字或字母的元素频率是一项复杂的任务。可以使用各种算法,如搜索、数组和分治法,来查找数组中定义的重复元素。

注意 - 使用整数数组。

让我们探索这篇文章,了解如何使用Java编程语言来解决这个问题。

举几个例子

示例-1

如果:

 Number of Elements in Arr[] = N = 4
Arr[] = [5, 7, 6, 7]

那么:

Number  Frequency
5     1
7     2
6     1
arr 索引 0 1 2 3
5 7 6 7
data 索引 0 1 2 3
freq 索引 0 1 2 3
大小 0
i = 0 found = FALSE
j = 0 j < size $\mathrm{\Rightarrow}$ 0 < 0 $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 循环中断
IF (found == FALSE) $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入IF条件 data[size] = arr[i] $\mathrm{\Rightarrow}$ data[0] = arr[0] $\mathrm{\Rightarrow}$ data[0] = 5 freq[size] = 1 $\mathrm{\Rightarrow}$ freq[0] = 1 size += 1 $\mathrm{\Rightarrow}$ size = size + 1 $\mathrm{\Rightarrow}$ size = 0 + 1 $\mathrm{\Rightarrow}$ size = 1
arr 索引 0 1 2 3
5 7 6 7
data 索引 0 1 2 3
5
freq 索引 0 1 2 3
1
大小 1
i = 1 found = FALSE
j = 0 j <size $\mathrm{\Rightarrow}$ 0 < 1 $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入FOR循环 IF (arr[i] == data[j]) $\mathrm{\Rightarrow}$ (arr[1] == data[0]) $\mathrm{\Rightarrow}$ (7 == 5) $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 退出IF条件
j = 1 j < size $\mathrm{\Rightarrow}$ 1 < 1 $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 循环中断
IF (found == FALSE) $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入IF条件 data[size] = arr[i] $\mathrm{\Rightarrow}$ data[1] = arr[1] $\mathrm{\Rightarrow}$ data[1] = 7 freq[size] = 1 $\mathrm{\Rightarrow}$ freq[1] = 1 size += 1 $\mathrm{\Rightarrow}$ size = size + 1 $\mathrm{\Rightarrow}$ size = 1 + 1 $\mathrm{\Rightarrow}$ size = 2
arr 索引 0 1 2 3
5 7 6 7
data 索引 0 1 2 3
5 7
freq 索引 0 1 2 3
1 1
大小 2
i = 2 found = FALSE
j = 0 j < size $\mathrm{\Rightarrow}$ 0 < 2 $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入FOR循环 IF (arr[i] == data[j]) $\mathrm{\Rightarrow}$ (arr[2] == data[0]) $\mathrm{\Rightarrow}$ (6 == 5) $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 退出IF条件
j = 1 j < size $\mathrm{\Rightarrow}$ 1 < 2 $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入FOR循环 IF (arr[i] == data[j]) $\mathrm{\Rightarrow}$ (arr[2] == data[1]) $\mathrm{\Rightarrow}$ (6 == 7) $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 退出IF条件
j = 2 j < size $\mathrm{\Rightarrow}$ 2 < 2 $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 循环中断
IF (found == FALSE) $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入IF条件 data[size] = arr[i] $\mathrm{\Rightarrow}$ data[2] = arr[2] $\mathrm{\Rightarrow}$ data[2] = 6 freq[size] = 1 $\mathrm{\Rightarrow}$ freq[2] = 1 size += 1 $\mathrm{\Rightarrow}$ size = size + 1 $\mathrm{\Rightarrow}$ size = 2 + 1 $\mathrm{\Rightarrow}$ size = 3
arr 索引 0 1 2 3
5 7 6 7
data 索引 0 1 2 3
5 7 6
freq 索引 0 1 2 3
1 1 1
大小 3
i = 3 found = FALSE
j = 0 j < size $\mathrm{\Rightarrow}$ 0 < 3 $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入FOR循环 IF (arr[i] == data[j]) $\mathrm{\Rightarrow}$ (arr[3] == data[0]) $\mathrm{\Rightarrow}$ (7 == 5) $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 退出IF条件
j = 1 j < size $\mathrm{\Rightarrow}$ 1 < 3 $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入FOR循环 IF (arr[i] == data[j]) $\mathrm{\Rightarrow}$ (arr[3] == data[1]) $\mathrm{\Rightarrow}$ (7 == 7) $\mathrm{\Rightarrow}$ TRUE $\mathrm{\Rightarrow}$ 进入IF条件 freq[j] += 1 $\mathrm{\Rightarrow}$ freq[1] += 1 $\mathrm{\Rightarrow}$ freq[1] = freq[1] + 1 $\mathrm{\Rightarrow}$ freq[1] = 1 + 1 = 2 found = TRUE 循环中断
IF (found == FALSE) $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 退出IF条件
arr 索引 0 1 2 3
5 7 6 7
data 索引 0 1 2 3
5 7 6
freq 索引 0 1 2 3
1 2 1
大小 3
i = 4 i < N $\mathrm{\Rightarrow}$ 4 < 4 $\mathrm{\Rightarrow}$ FALSE $\mathrm{\Rightarrow}$ 循环中断

示例-2

如果:

 Number of Elements in Arr[] = N = 8
Arr[] = [6, 7, 8, 9, 5, 4, 3, 5]

那么:

Number  Frequency
 3      1
 4      1
 5      2
 6      1
 7      1
 8      1
 9      1

语法

为了存储元素的频率,可以使用内置的Map接口。

下面是它的语法:

map<int, int> freqCounter;

这里,频率计数器用于存储频率,第一个元素是“键”,第二个元素是“值”,对应于“键”。

多种方法

我们提供了多种方法的解决方案。

  • 通过两个名为data[] 和 freq[] 的数组,通过它们的索引进行映射。

  • 通过使用“map”来存储数据和频率。

方法-1:使用两个数组data[] 和 freq[],通过它们的索引进行映射

在这个算法中,使用了两个不同的数组data[] 和 freq[]。data[] 用于存储唯一元素,freq[] 用于存储频率。在这种情况下,data[] 和 freq[] 数组通过索引进行映射。

算法 1

步骤-1:向用户询问N(数组中存在的元素数量)。

步骤-2:向用户询问arr[] 的N个元素。

步骤-3:创建两个名为data[N] 和 freq[N] 的整数数组。

步骤-4:创建整数变量“size”。

步骤-5:外循环 (i=0 到 N-1)

步骤-6:设置 found = FALSE

步骤-7:内循环 (j=0 到 size-1)

步骤-8:如果 arr[i] == data[j],则

步骤-9:将freq[j] 加1

步骤-10:设置 found = TRUE

步骤-11:中断内循环

步骤-12:如果 found == FALSE,则

步骤-13:设置 data[size] = arr[i]

步骤-14:设置 freq[size] = 1

步骤-15:将size 加1

步骤-16:显示data[] 数组和 freq[] 数组。

步骤-17:退出

示例

#include <iostream>
using namespace std;

/**
* find and print the frequency
*
* @param arr: array is an integer array
* @param N: Number of elements present in arr[]
*/
void displayFreq(int arr[], int N) {
   // create 2 arrays
   // one for storing data
   // second for storing frequency
   int data[N], freq[N], size = 0;

   // traverse the array
   for (int i=0; i<N; ++i) {
     bool found = false;
     // check for arr[i] in data[] array
     for (int j=0; j<size; ++j) {
       if (arr[i] == data[j]) {
         freq[j] += 1;
         found = true;
         break;
       }
     }

     // if arr[i] not found in data[] array
     if (found == false) {
       data[size] = arr[i];
       freq[size] = 1;
       size += 1;
     }
   }

   // display the result
   cout << "Number\tFrequency\n";
   for (int i=0; i<size; ++i) {
     cout << data[i]<< "\t" << freq[i] << endl;
   }
}

int main() {
   // declare N, and arr[]
   int N, arr[10000];

   cout << "Enter the required number: ";
   cin >> N;

   // Input elements in the array
   cout << "Enter " << N << " Numbers separated by SPACE: ";
   for (int i=0; i<N; ++i) {
     cin >> arr[i];
   }

   // call the function
   displayFreq(arr, N);

   return 0;
}

输出

Enter the required number: 7
Enter 7 Numbers separated by SPACE: 9 5 4 9 7 5 3
Number  Frequency
9     2
5     2
4     1
7     1
3     1

方法-2:使用“map”存储数据和频率。

此算法使用“map”数据类型以键值对的形式存储数据和频率。

算法

步骤-1:向用户询问N(数组中存在的元素数量)。

步骤-2:向用户询问arr[] 的N个元素。

步骤-3:创建一个Map来存储频率

步骤-4:对于arr[] 的每个元素,增加已创建Map中的频率计数器

步骤-5:在控制台中显示元素及其频率。

步骤-6:退出

示例

#include <iostream>
#include <map>

using namespace std;

/**
* find and print the frequency
*
* @param arr: array is an integer array
* @param N: Number of elements present in arr[]
*/
void displayFrequency(int arr[], int N) {
   // create map with the name freqCounter
   map<int, int> freqCounter;

   // traverse each element of array
   for (int i=0; i<N; ++i) {
     // check for arr[i] in map "freqCounter"
     if (freqCounter.find(arr[i]) == freqCounter.end()) {
       freqCounter.insert({arr[i], 1});
     } else {
       freqCounter[arr[i]] += 1;
     }
   }

   // display the result
   cout << "Number\tFrequency\n";
   std::map<int, int>::iterator ptr = freqCounter.begin();
   while (ptr != freqCounter.end()) {
     cout << ptr->first << "\t" << ptr->second << "\n";
     ++ptr;
   }
}

int main() {
   // declare N, and arr[]
   int N, arr[10000];

   cout << "Enter the required number: ";
   cin >> N;

   // Input elements in the array
   cout << "Enter " << N << " Numbers separated by SPACE: ";
   for (int i=0; i<N; ++i) {
     cin >> arr[i];
   }

   // call the function
   displayFrequency(arr, N);

   return 0;
}

输出

Enter the required number: 10
Enter 10 Numbers separated by SPACE: 5 6 7 9 8 5 4 3 6 5
Number  Frequency
3     1
4     1
5     3
6     2
7     1
8     1
9     1

这个问题通过三种不同的方法来解决,这取决于任务的需求。本文阐述了计算数组中出现的元素频率的方法。

更新于:2023年8月28日

192 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告