如果我允许额外存储O(N),我可以使用哈希表和BST来解决以下问题吗?
计算数组中所有元素的频率?
查找哪个数字在数组中重复最多次?
我最感兴趣的是整数元素。
答案 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;,元素来源......的定义)