用分治法求众数问题,输入输出在文件中,C语言或c++
时间: 2024-09-26 19:06:24 浏览: 59
c语言分治法求众数重数-五大常见算法策略之——递归与分治策略,算法数据结构
5星 · 资源好评率100%
分治法求解众数问题通常涉及将大数据集分解成较小的部分,然后递归地找出每个部分的众数,最后合并结果。对于这个问题,我们可以设计一个基于计数排序的解决方案,结合分治策略。以下是一个简单的C++示例,假设输入文件存储的是整数数组,输出文件用于保存众数:
```cpp
#include <iostream>
#include <fstream>
#include <vector>
#include <unordered_map>
// 分治函数:找到数据范围内的众数
int findMode(int left, int right, std::vector<int>& nums, std::unordered_map<int, int>& countMap) {
if (left == right) { // 如果只有一个元素,那就是唯一的众数
return nums[left];
}
int mid = left + (right - left) / 2;
int modeLeft = findMode(left, mid, nums, countMap);
int modeRight = findMode(mid + 1, right, nums, countMap);
// 更新左右两边的计数
countMap[modeLeft]++;
countMap[modeRight]++;
// 找出哪边的数量更多
if (countMap[modeLeft] > countMap[modeRight]) {
return modeLeft;
} else if (countMap[modeRight] > countMap[modeLeft]) {
return modeRight;
} else {
return modeLeft; // 如果一样多,返回左边的作为均衡的选项
}
}
int main() {
std::ifstream inputFile("input.txt"); // 读取输入文件
std::ofstream outputFile("output.txt"); // 写入输出文件
if (!inputFile.is_open()) {
std::cerr << "Failed to open input file." << std::endl;
return 1;
}
if (!outputFile.is_open()) {
std::cerr << "Failed to open output file." << std::endl;
return 1;
}
int n;
inputFile >> n;
std::vector<int> nums(n);
for (int i = 0; i < n; ++i) {
inputFile >> nums[i];
}
inputFile.close();
std::unordered_map<int, int> countMap;
int mode = findMode(0, n - 1, nums, countMap);
outputFile << "The mode is: " << mode << std::endl;
outputFile.close();
return 0;
}
```
在这个程序中,我们首先读取输入文件中的数字,然后通过递归的方式分割数据并计算每个元素的频率。最后,我们在输出文件中写下找到的众数。
阅读全文