字符串的出现次数统计

利用C++的库map,string.

处理《圣经》只需要7.6s,其中读2.4s,插入操作4.9s,输出操作0.3s。

 

#include <iostream> #include <stdlib.h> #include <string> #include <map> using namespace std; int main() { map<string, int> stringShowTimes; map<string, int>::iterator itr; string t; while(cin >> t) { stringShowTimes[t]++; } for(itr = stringShowTimes.begin(); itr != stringShowTimes.end(); itr++) { cout << itr->first << " " << itr->second<<endl; } system("pause"); }

 

利用Hash的话可以相比上面节省更少的时间,但是需要的空间会增加。(空间换时间法)

由于《圣经》大约只有29131个不同的单词,于是我们采用了29131最接近这个数的质数作为散列表的大小。

 

如字符串abc的Hash值为

(97 *31 + 98)  * 31  + 99

 

具体算法如下:

#include <stdio.h> #include <stdlib.h> #include <string.h> #define NHASH 29989 #define MULT 31 typedef struct Node{ char *word; int times; Node *next; } Node; Node * bin[NHASH]; int hash(char *p) { int result = 0; for( ; *p != NULL; p++) { result = result*MULT + *p; if(result > NHASH) { result = result % NHASH; } } return result; } void incWord(char *s) { int h = hash(s); for(Node *index = bin[h]; index != NULL; index = index->next) { if(strcmp(index->word, s) == 0) { index->times++; return ; } } Node *ptr = new Node(); ptr->times = 1; ptr->word = new char[strlen(s)+1]; strcpy(ptr->word, s); // insert this new NodePtr into the first position of array bin ptr->next = bin[h]; bin[h] = ptr; } int main() { char buf[50]; while(scanf("%s", buf) != EOF) { incWord(buf); } for(int i=0; i<NHASH; i++) { for(Node *p = bin[i]; p != NULL; p = p->next) { printf("%s %d/n", p->word, p->times); } } system("pause"); }

你可能感兴趣的:(算法,struct,null,iterator,System,insert)