本文章內容來源於《程序員面試寶典》。
題目:
有1千萬條短信,以文本文件的形式保存,一行一條,有重複。請用5分鐘時間,找出重複出現最多的前10條。
解析:
思路:
struct TNode
{
BYTE *pText;
//直接指向文件映射的內存地址
DWORD dwCount;
//計算器,記錄此節點的相同短信數
TNode *ChildNodes[256];
//子節點數據,由於一個字母的ASCII值不可能超過256,所以子節點也不可能超過256
TNode()
{
//初始化成員
}
~TNode()
{
//釋放資源
}
};
//int nIndex是字母下標
void CreateChilsNode(TNode *pNode,const BYTE* pText,int nIndex)
{
if(pNode->ChildNodes[pText[nIndex]]==NULL)
{
//如果不存在此子節點,就創建.TNode構造函數應該有初始化代碼
//爲了處理方便,這裏也可以在創建的同時把此節點加到一個數組中
pNode->ChildNodes[pText[nIndex]]=new TNode;
}
if(pText[nIndex+1]=='\0')
{
//此短信已完成,計數器加1,並保存此短信內容
pNode->ChildNodes[pText[nIndex]]->dwCount++;
pNode->ChildNodes[pText[nIndex]]->pText=pText;
}
else //if(pText[nText]!='\0')
{
//如果還未結束,就創建下一級節點
CreateNode(pNode->ChildNodes[pText[nIndex]],pText,nText+1);
}
}
//創建根節點,pTexts是短信數組,dwCount是短信數量(這裏是1千萬)
void CreateRootNode(const BYTE **pTexts,DWOED dwCount)
{
TNode RootNode;
for(DWORD dwIndex=0;dwIndex<dwCount;dwIndex++)
{
CreateNode(&RootN,pTexts[dwIndex],0);
}
//所有節點按dwCount的值進行排序
//取前10個節點,顯示結果
}