寻找最大的k个数,TopK问题的C++实现
2亿个整数中求最大的100万之和
题目:有一个文件中保存了2亿个整数,每个整数都以' '分隔。求最大的100万个整数之和。
算法:
1. 首先建立一个容量为100万(nTop)的int数组,从文件读取整数填充。
2. 利用堆维护该100万条记录(确保堆顶元素为最小值)
3. 从文件中读取一个整数与堆顶元素比较,如果大于堆顶元素则替换该元素,并调整堆的结构。
4. 重复步骤3一直到数据读取完
5. 将数组中的元素全部相加,得到结果
参考源代码:
#include
using namespace std;
template
class CTopK
{
public:
CTopK();
~CTopK();
T* m_Data;
int GetTopK(const char* sFile, int& nTop);
private:
void Clear();
void HeapAdjust(int nStart, int nLen);
void BuildHeap(int nLen);
};
template
CTopK::CTopK()
{
m_Data = NULL;
}
template
CTopK::~CTopK()
{
Clear();
}
template
void CTopK::Clear()
{
if (NULL != m_Data)
{
delete[] m_Data;
m_Data = NULL;
}
}
//获取前top的k个数
template
int CTopK::GetTopK(const char* sFile, int& nTop)
{
FILE* fp = NULL;
T fData;
int i = 0;
//判断输入参数
if ( (NULL == sFile) || (nTop <= 0) )
{
cout << "error parameter" << endl;
return -1;
}
//清除操作
Clear();
//打开文件
fp = fopen(sFile, "r");
if (NULL == fp)
{
cout << "open file failed!" << endl;
return -1;
}
//分配空间
m_Data = new T[nTop];
if (NULL == m_Data)
{
cout << "new operator failed!" << endl;
return -1;
}
cout << "please wait..." << endl;
//读取前nTop个数据,注意数据的类型T
for (i = 0; i < nTop; i++)
{
if (EOF != fscanf(fp, "%d", &fData))
{
m_Data[i] = fData;
}
else
{
br