競賽程式設計中的頻率測量技術


在本文中,我們將探討查詢陣列[]中數字頻率的不同方法。這些方法在解決不同情況下的各種競賽程式設計問題時非常有用。有時,計算陣列中出現的數字或字母的元素頻率是一項複雜的任務。可以使用各種演算法,如搜尋、陣列和分治法,來查詢陣列中定義的重複元素。

注意 - 使用整數陣列。

讓我們探索這篇文章,瞭解如何使用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 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告