是的,这两个任务都可以使用哈希表和 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;
}
请注意,此答案将整数(或其他可枚举类型)称为元素。对于浮点,答案可能会因各种因素而完全不同(“平等”的定义、元素的来源……)