在 C++ 中统计排序数组中元素的出现次数(或频率)
给定一个排序的整数型元素数组和一个数字,例如 num,任务是计算给定元素 num 在数组中出现的次数。
输入 − int arr[] = {1, 1, 1,2, 3, 4}, num = 1
输出 − 排序数组中数字出现的次数为 − 3
输入 − int arr[] = {2, 3, 4, 5, 5, 6, -7}, num = 5
输出 − 排序数组中数字出现的次数为 − 2
输入 − int arr[] = {-1, 0, 1, 2, 3}, num = 7
输出 − 排序数组中数字出现的次数为 − 0
下面程序中使用的算法如下
有多种方法可以解决上述问题。
朴素算法
声明一个包含正数和负数的整数元素数组和一个整数变量 num,我们需要找到它在数组中的频率。
计算数组的大小并将所有数据传递给函数以进行进一步处理。
声明一个临时变量 count 来存储变量 num 出现的次数
从 i = 0 开始循环到数组大小
在循环内,如果 num = arr[i],则将 count 的值加 1
返回 count
打印结果。
高效算法
声明一个包含正数和负数的整数元素数组和一个整数变量 num,我们需要找到它在数组中的频率。
计算数组的大小并将所有数据传递给函数以进行进一步处理。
声明一个临时变量 count 来存储变量 num 出现的次数
将第一个指针设置为 lower_bound(arr, arr+size, num)
如果 first = (arr + size) || (*first != num),则返回 0
将 end 指针设置为 upper_bound(first, arr+size, num)
将 count 设置为 last - first
返回 count
打印结果
示例(朴素算法)
#include <iostream> using namespace std; int frequency_count(int arr[], int num, int size){ int count = 0; for(int i=0; i<size; i++){ if(num==arr[i]){ count++; } } return count; } int main(){ int arr[] = {1, 1, 1,2, 3, 4}; int num = 1; int size = sizeof(arr)/sizeof(arr[0]); cout<<"Count of number of occurrences (or frequency) in a sorted array are: "<<frequency_count(arr, num, size); return 0; }
输出
如果我们运行上面的代码,它将生成以下输出:
Count of number of occurrences (or frequency) in a sorted array are: 3
示例(高效算法)
# include <bits/stdc++.h> using namespace std; int frequency_count(int arr[], int num, int size){ int *first = lower_bound(arr, arr+size, num); if (first == (arr + size) || *first != num){ cout<<"The Element is not present in an array "; return 0; } int count = 0; int *last = upper_bound(first, arr+size, num); count = last - first; return count; } int main(){ int arr[] = {1, 1, 1, 2, 3, 4}; int num = 1; int size = sizeof(arr)/sizeof(arr[0]); cout<<"Count of number of occurrences (or frequency) in a sorted array are: "<<frequency_count(arr, num, size); return 0; }
输出
如果我们运行上面的代码,它将生成以下输出:
Count of number of occurrences (or frequency) in a sorted array are: 3