สมมติว่าเรามีอาร์เรย์ของจำนวนเต็ม อาร์เรย์คือ A และขนาดคือ n งานของเราคือการหาความถี่ขององค์ประกอบทั้งหมดในอาร์เรย์ที่น้อยกว่า O(n) เวลา ขนาดขององค์ประกอบต้องน้อยกว่าหนึ่งค่าที่บอกว่า M ในที่นี้เราจะใช้วิธีการค้นหาแบบไบนารี ในที่นี้ เราจะแบ่งอาร์เรย์ออกเป็นสองส่วนซ้ำๆ หากองค์ประกอบสิ้นสุดต่างกัน หากองค์ประกอบสิ้นสุดทั้งสองเหมือนกัน หมายความว่าองค์ประกอบทั้งหมดในอาร์เรย์จะเหมือนกันกับการจัดเรียงอาร์เรย์แล้ว
ตัวอย่าง
#include<iostream> #include<vector> using namespace std; void calculateFreq(int arr[], int left, int right, vector<int>& frequency) { if (arr[left] == arr[right]) frequency[arr[left]] += right - left + 1; else { int mid = (left + right) / 2; calculateFreq(arr, left, mid, frequency); calculateFreq(arr, mid + 1, right, frequency); } } void getAllFrequency(int arr[], int n) { vector<int> frequency(arr[n - 1] + 1, 0); calculateFreq(arr, 0, n - 1, frequency); for (int i = 0; i <= arr[n - 1]; i++) if (frequency[i] != 0) cout << "Frequency of element " << i << " is " << frequency[i] << endl; } int main() { int arr[] = { 10, 10, 10, 20, 30, 30, 50, 50, 80, 80, 80, 90, 90, 99 }; int n = sizeof(arr) / sizeof(arr[0]); getAllFrequency(arr, n); }
ผลลัพธ์
Frequency of element 10 is 3 Frequency of element 20 is 1 Frequency of element 30 is 2 Frequency of element 50 is 2 Frequency of element 80 is 3 Frequency of element 90 is 2 Frequency of element 99 is 1