当前位置: 首页 > 编程笔记 >

在C ++中以小于O(n)的时间在有限范围的数组中查找每个元素的频率

郝峰
2023-03-14
本文向大家介绍在C ++中以小于O(n)的时间在有限范围的数组中查找每个元素的频率,包括了在C ++中以小于O(n)的时间在有限范围的数组中查找每个元素的频率的使用技巧和注意事项,需要的朋友参考一下

假设我们有一个整数数组。数组为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
 类似资料:
  • 本文向大家介绍在C ++中,在频率大于或等于n / 2的排序数组中查找元素。,包括了在C ++中,在频率大于或等于n / 2的排序数组中查找元素。的使用技巧和注意事项,需要的朋友参考一下 考虑我们有一个大小为n的数组。该数组已排序。有一个元素的频率大于或等于n / 2,其中n是数组中元素的数量。因此,如果数组类似于[3,4,5,5,5],则输出将为5。 如果我们仔细观察这些类型的数组,我们可以很容

  • 本文向大家介绍在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数,包括了在C ++中对O(1)额外空间中数组中所有元素的频率和O(n)时间进行计数的使用技巧和注意事项,需要的朋友参考一下 给定一个范围从值1到n的元素数组。有些元素是重复的,而有些则缺失。目的是找到O(n)时间和O(1)额外空间中所有元素的频率。 输入值 输出结果 说明-最高元素是5,输出显示每个元素出现在数

  • 我有两个关于确定2个算法的时间复杂度的问题。 用比较法从一组n个不同的数字中确定最小的3个数字。 这3个元素可以使用O(log2n)比较来确定。 O(log2n)不够,但是可以使用n+O(1)比较来确定它们。 n+O(1)不够,但是可以使用n+O(logn)比较来确定它们。 n+O(logn)不够,但是可以使用O(n)比较来确定它们。 以上都没有。 这里,我想到的方法是取3个变量(例如:min1、

  • 问题内容: 我只需要找到1D中最小的第n个元素。 例如: 我想获得第五个最小的元素,所以我想要的输出是。 我当前的解决方案是这样的: 但是,找到5个最小的元素然后再选择最大的元素对我来说似乎很笨拙。有更好的方法吗?我是否缺少一个可以实现目标的功能? 有些问题的标题与此相似,但我没有看到任何答案。 编辑: 我本来应该提到它,但是性能对我来说很重要。因此,虽然不错的解决方案对我来说不起作用。 结果:

  • 这是一个面试问题。我们有一个大小为N的整数数组,包含0到N-1之间的元素。一个数字可能出现两次以上。目标是找到总和为给定数字X的对。 我使用了一个辅助数组,该数组包含主数组的元素计数,然后根据辅助数组重新排列主数组,以便对主数组进行排序,然后搜索对。 但是面试官想要空间复杂度常数,所以我告诉他对数组进行排序,但这不是时间复杂度解。他想要O(n)解。 是否有任何方法可以在没有任何额外空间的情况下在O

  • 假设我有一个由以下类组成的数组,按y升序排序: 如何在log(N)time中给定的最小值和最大值范围内找到数组中y值的Obj项目数? 我曾想过使用二进制搜索和减法来查找最小和最大元素的位置,但这不是2 log(n),因为它搜索了两次吗?