使用向量在数组中查找频率

问题描述

如何更改我的代码获取每个元素的计数? 使用我的代码一切正常。它有效,但我如何只更改那部分?

   #include <iostream>
   #include <vector> 

   void countFreq(int arr[],int n) 
   { 
      // Mark all array elements as not visited 
      std::vector<bool> visited(n,false); 

     // Traverse through array elements and 
     // count frequencies 
      for (int i = 0; i < n; i++) { 

      // Skip this element if already processed 
       if (visited[i] == true) 
            continue; 
      // Count frequency 
       int count = 1; 
       for (int j = i + 1; j < n; j++) { 
           if (arr[i] == arr[j]) { 
               visited[j] = true; 
               count++; 
              }  
      } 
       std::cout<<count<<" ";     
    } 
   } 

   int main() 
   { 
    int n;
    std::cin>>n;
    int arr[n];
    for(int i = 0; i < n; i++){
        std::cin>>arr[i];
    }
    countFreq(arr,n); 
    return 0; 
   } 

关于结果`

input 10
      1 1 2 2 3 3 4 4 5 5


output 2 2 2 2 2

但我想得到

 output 2 2 2 2 2 2 2 2 2 2

(对于每个元素)

解决方法

如果您知道输入数组中的最大元素是多少,则可以通过这种方式找到数字的频率。假设 m 是数组中的最大数量。 所以你必须创建一个大小为 m 的新数组。您可以简单地将它们关联为 m 存储桶。从 0 到 m。每个桶将保存输入数组中每个元素的计数。每个桶的索引将引用输入数组中的元素。如果我们知道数组的最大元素是多少,则时间复杂度为 O(1)。

你可以这样做:

std::vector<int> frequencey(std::vector<int>& nums){
    auto max = *(std::max_element(nums.begin(),nums.end()));
    std::vector<int> frequencies(max + 1,0);
    for(int i = 0; i < nums.size(); ++i){
        frequencies[nums[i]] +=1;
    }

    return frequencies;
}
,

您需要将结果保存到每个数字的数组中。然后当你找到任何处理过的数字时,从保存的数组中打印计数器。

#include <iostream>
#include <vector>
#include <unordered_map>

void countFreq(int arr[],int n)
{
    // Mark all array elements as not visited
    std::vector<bool> visited(n,false);
    std::unordered_map<int,int> counter;

    // Traverse through array elements and
    // count frequencies
    for (int i = 0; i < n; i++)
    {

        // Skip this element if already processed
        if (visited[i] == true)
        {
            std::cout << counter[arr[i]] << " ";
            continue;
        }
        // Count frequency
        int count = 1;
        for (int j = i + 1; j < n; j++)
        {
            if (arr[i] == arr[j])
            {
                visited[j] = true;
                count++;
            }
        }
        counter[arr[i]] = count;
        std::cout<<count<<" ";
    }
}

int main()
{
    int n;
    std::cin>>n;
    int arr[n];
    for(int i = 0; i < n; i++)
    {
        std::cin>>arr[i];
    }
    countFreq(arr,n);
    return 0;
}
,

您的函数包含额外的代码,最终会让您感到困惑。 visited 变量本质上是不必要的。在 count 处启动 0 并且不对“当前”单元格设置特殊情况,您会发现一些非常简单的代码可以满足您的需求:

void countFreq(int arr[],int n) 
{ 
    // Traverse through array elements and 
    // count frequencies 
    for (int i = 0; i < n; i++) { 

        // Count frequency 
        int count = 0; 
        for (int j = 0; j < n; j++) { 
            if (arr[i] == arr[j]) { 
                count++; 
            }  
        }

        std::cout << count << " ";     
   } 
}
,

问题在于您丢弃了已经访问过的值。

一种可能性是在第一次访问该值时记住计数, 并记住第一个值出现的索引值,当一个值被第二次、第三次访问时......

#include <iostream>
#include <vector> 

void countFreq(const std::vector<int>& arr) { 
   int n = arr.size();
      // Mark all array elements as not visited 
   std::vector<int> mem_count(n,n); 

     // Traverse through array elements and 
     // count frequencies 
    for (int i = 0; i < n; i++) { 

      // Skip this element if already processed 
        if (mem_count[i] != n) {
            std::cout << mem_count[mem_count[i]] << " ";
            continue; 
        }
        // Count frequency 
        int count = 1; 
        for (int j = i + 1; j < n; j++) { 
            if (arr[i] == arr[j]) { 
                  mem_count[j] = i; 
                  count++; 
            }  
        }
        mem_count[i] = count;
        std::cout << count << " ";     
    } 
} 

int main() { 
    int n;
    std::cin>>n;
    std::vector<int> arr(n);
    for(int i = 0; i < n; i++){
        std::cin >> arr[i];
    }
    countFreq(arr); 
    return 0; 
} 
,

这个很简单

#include <vector>
#include <map>
#include <iostream>

void main()
{
    std::vector<int> v { 1,1,2,3,4,5,5 }; // Your input vector

    // Count "frequencies"
    std::map<int,int> m;
    for (auto i : v)
        m[i]++;

    // Print output
    for (auto i : v)
        std::cout << m[i] << " ";
}