【问题标题】:Using Hash Table to count the frequencies - Self Made使用哈希表计算频率 - 自制
【发布时间】:2017-01-09 04:13:47
【问题描述】:

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

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

  2. 找出数组中哪个数字重复的次数最多?

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

【问题讨论】:

  • 这闻起来像家庭作业。
  • 元素是什么,它们是如何生成的?例如,整数的行为与浮点数不同。
  • 我这里只关心整数。
  • 您能否澄清您的问题中“频率”和“出现次数”之间的区别? (对不起,如果这是微不足道的,我不是以英语为母语的人)
  • 我认为两者都是一样的。两者都说,一个元素出现了多少次

标签: arrays algorithm hashtable


【解决方案1】:

是的,这两个任务都可以使用哈希表和 BST 完成,需要线性空间。

哈希表和二叉搜索树都可以实现映射接口,可以通过键快速查找,并将其链接到值。

您可以使用此映射接口来实现一个直方图,该直方图从您的键映射到一个整数。
您迭代数组,并为每个元素在地图中查找它(作为键)。如果此键存在,则获取该值,并将其加一。
否则,将此新元素插入到值为 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;
}

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

【讨论】:

  • 是的,谢谢,这是我正在寻找的一种解释。
猜你喜欢
  • 2020-03-20
  • 2017-09-14
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多