使用哈希表计算频率 - 自制

时间:2016-09-01 10:14:40

标签: arrays algorithm hashtable

如果我允许额外存储O(N),我可以使用哈希表和BST来解决以下问题吗?

  1. 计算数组中所有元素的频率?

  2. 查找哪个数字在数组中重复最多次?

  3. 我最感兴趣的是整数元素。

1 个答案:

答案 0 :(得分:2)

是的,这两项任务都可以使用Hash表和BST完成,并且需要线性空间。

哈希表和二进制搜索树都可以实现一个地图界面,您可以通过键快速查看,并将其链接到一个值。

您可以使用此地图界面实现直方图,该直方图从您的键映射到整数。
您迭代数组,并为每个元素在地图中查找(作为键)。如果此键存在,请获取值,并将其增加1。
否则,将此新元素插入值为1的地图。

完成此操作后,您将拥有满足要求1的地图。
要满足第二个要求,只需迭代地图并找到与最高值关联的密钥,然后将其返回。

这是通过所需的线性额外空间完成的,当地图基于哈希表时在O(n)完成,而当基于BST时O(nlogn)完成。 (所有平均情况,对于BST,使用自平衡BST时间复杂度可能是O(nlogn)最坏情况。)

带有实现地图界面的哈希映射的C ++ 11代码

#include <iostream>
#include <unordered_map>
using namespace std;

int main() {
    int array[] = {1,9,9,7,5,4,1,2,0,1,0};
    std::unordered_map<int,int> histogram;
    for (int x : array) { 
        auto in_map = histogram.find(x);
        if (in_map == histogram.end()) { 
            histogram[x] = 1;
        } else { 
            ++(in_map->second);
        }
    }
    int most_occurances_element = -1;
    int most_occurances = -1;
    for (const auto& kv : histogram) {
      if (kv.second > most_occurances) {
        most_occurances_element = kv.first;
        most_occurances = kv.second;
      }
    }
    std::cout << "Most frequent element " << most_occurances_element << " with "
        << most_occurances << " occurances.";
    return 0;
}

请注意,此答案将整数(或其他可枚举类型)称为元素。对于浮点数,答案可能会因各种因素而完全不同(&#34;等式&#34;,元素来源......的定义)