哈希结构---访问大文件(查看单个文件中出现最多的单词)

//该文件每一行都放入一个单词,接近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;

你可能感兴趣的:(struct,File,null,FP,fun)