题外话:想当年,编译原理课偷懒没自己实现这玩意,欠的终究还是要还的,现在补回来了。。。
Write a program for displaying the ten most frequent words in a file
such that your program should be efficient in all complexity measures.
/*(针对大量数据的作法)
思路:每读一个单词 ,存入字典序的平衡二叉搜索树中,这样判断是否新单词或旧单词词频加一
的扫描时间复杂度大大减小;读取完整个文本,建好树后,遍历一遍树,用最小堆存取
词频最大的10个单词,堆顶为词频最小的单词,所以每次只要与堆顶比较,需要替换则重排,
遍历完即出结果
*/
/*
本来打算建一张10个数据结构大小的哈希表,存储10个出现频数最大的单词词频,逐个读短文单词
边插入树结点时边更新表,
之后想若同一单词出现的频数很多,这样同一个单词得更新表很多次,不划算,
不如建好等平衡树后
遍历一遍,找出count最大的十个单词,这样每个不同的单词只遍历一次。
*/
/*
以下程序strcpy虽然能正确执行,但实际上有问题,可以换为如下,我就不换了,就重写个strcpy函数就好
strncpy(path, src, sizeof(path) - 1);
path[sizeof(path) - 1] = '/0';
len = strlen(path);
*/
#include<stdio.h>
#include<string>
#include<string.h>
#include<vector>
#include<stdlib.h>
using namespace std;
#define wordLength 20
#define maxCountNum 10
struct AVLTree
{
char word[wordLength];//单词
int count;//计数
int height;//树的深度
struct AVLTree* lTree;//左子树
struct AVLTree* rTree;//右子树
};
/*存储出现频率最大的十个结点*/
struct MAXCount
{
//string word;
char word[wordLength];//单词
int count;//计数
};
vector <struct MAXCount> maxCount(maxCountNum);
/*返回大值*/
int Max(int a,int b);
/*返回结点的深度*/
int Height(struct AVLTree* node);
/*插入子结点*/
st