//该文件每一行都放入一个单词,接近2M,没想到采用HASH方法,速度会这么快,运行时间为:0.085S~~~-不可思议,哈哈
//思路:定义一个大小为26的数组,即26个字字母。然后每个数组下挂着一个链表
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
#include <string>
#include <map>
#include "time.h"
using namespace std;
inline int hash_fun(char*str)
{
return (*str-'a');
}
struct HASH
{
char* word;//存放的单词
int count;//出现的次数
HASH* next;
};
void main()
{
cout<<"multimpa-----begin"<<endl;
clock_t start,finish;
double duration;
HASH tempHash[26];
//赋初始值
for (int i=0;i<26;i++)
{
tempHash[i].next=NULL;
tempHash[i].word=NULL;
tempHash[i].count=0;
}
int key=0;
FILE *fp=NULL;
char strTmp[10];
memset(strTmp,0,10);
/* 打开文件 */
fp = fopen( "test2.txt ","r ");//此时的文件大小为2M
if( NULL == fp )
{
printf( "Open File Error\n ");
return;
}
/* 顺序读取每行 */
start=clock();
while( NULL != fgets(strTmp,10,fp ) )
{
// printf( "Line Info = %s ", strTmp);
bool flag=false;
flag=false;
//哈希映身
key=hash_fun(strTmp);
//cout<<"map value:"<<key<<endl;
HASH* temp=tempHash[key].next;
while (temp!=NULL)
{
if (strcmp(temp->word,strTmp)==0)
{
//统计次数
flag=true;
temp->count+=1;
break;
}
else
{
temp=temp->next;
}
}
if (flag==false)
{
HASH* newNode=new HASH();
newNode->word=strTmp;
newNode->count=1;
//插入元素
newNode->next=tempHash[key].next;
tempHash[key].next=newNode;
}
}
fclose(fp);
//统计出现次数最多的字符串
char* tempCh=NULL;
int tempMaxCount=1;
for (int i=0;i<26;i++)
{
HASH* temp=tempHash[i].next;
while (temp)
{
if (temp->count>tempMaxCount)
{
tempMaxCount=temp->count;
tempCh=temp->word;
}
temp=temp->next;
}
}
cout<<"次数最多的单词:"<<tempCh<<"次数为:"<<tempMaxCount<<endl;
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
cout<<"所运行的时间"<<duration<<endl;