实验三:基于线性表和二叉排序树的低频词过滤系统
一、实验内容
对于一篇给定的英文文章,分别利用线性表和二叉排序树来实现单词频率的统计,实现低频词的过滤,并比较两种方法的效率。
二、实验要求
- 读取英文文章文件(Infile.txt),识别其中的单词。
- 分别利用线性表和二叉排序树构建单词的存储结构。当识别出一个单词后,若线性表或者二叉排序树中没有该单词,则在适当的位置上添加该单词;若该单词已经被识别,则增加其出现的频率。
- 统计结束后,删除出现频率低于五次的单词,并显示该单词和其出现频率。
- 其余单词及其出现频率按照从高到低的次序输出到文件中(Outfile.txt),同时输出用两种方法完成该工作所用的时间。
- 计算查找表的ASL值,分析比较两种方法的效率。
- 系统运行后主菜单如下:
-
当选择1后进入以下界面:
其中选择2时显示利用线性表来实现所有功能所用的时间。
当在主菜单选择2二叉排序树后,进入的界面与上图类同。
三、 实验所需数据结构
1、线性表
2、二叉树
四、实验思路
1、要求分析
(1) 在统计的过程中,分词时可以利用空格或者标点符号作为划分单词依据,文章中默认只包含英文单词和标点符号。
(2)对单词进行排序时,是按照字母序进行的,每个结点还应包含该单词出现的频率。
(3)存储结构的定义
//二叉排序树的存储定义
typedef struct BiNode {
string WordName; //单词名称
int count; //单词出现频率
struct BiNode* lchild;
struct BiNode* rchild;
} BSTNode, * BSTree;
//线性表的存储定义
typedef struct LNode {
string WordName;
int count;
LNode* next;
}LNode, *LinkList;
2、线性表伪代码
//线性表类封装
class Linear{
private:
LNode* first;
public:
//链表的创建 构造函数
Linear() {
first = new LNode();
first->next = NULL;
}
//线性表添加单词
void LinearAdd(string tempWord);
//读取文件
void LinearRead();
//删除频率低于5的单词
void LinearDelete();
//高频写入文件
void LinearWrite();
//线性表
void LinearTable();
//计算ASL
void FindASL();
};
3、二叉树伪代码
//二叉排序树类
class BiSortTree {
private:
BiNode* root;
public:
//二叉树的创建 构造函数
BiSortTree() {
root = new BiNode();
root = NULL;
}
//返回根节点 方便遍历
BiNode* GetRoot() {
return root;
cout << "GetRoot函数" << endl;
}
//二叉树添加单词
BiNode* InsertBST(BiNode* root,BiNode *s);
//读取文件
BiNode* ReadBST();
//查找某一结点的父亲结点
//BiNode* SearchBST1(BiNode* root,BiNode* r);
//删除二叉树的某一个结点
//void NextRep(BiNode* p);
//删除频率低于5的单词
void DeleteBST(BiNode* root);
//右中左遍历
void GetInBST(BiNode* root);
//完成写入文件
void WriteBST(BiNode* root);
//二叉排序树
void TableBST();
//计算ASL
void FindASL();
};
4、菜单
//主菜单
void Menu1() {
cout << "1、线性表" << endl;
cout << "2、二叉排序树" << endl;
cout << "3、退出系统" << endl;
cout << "请选择你需要的服务,输入数字(1~3):" << endl;
}
//菜单二
void Menu2() {
cout << "1、连续执行至完毕" << endl;
cout << "2、显示执行时间" << endl;
cout << "3、单步执行:识别并统计单词" << endl;
cout << "4、单步执行:删除并显示低频词汇" << endl;
cout << "5、单步执行:输出其余单词及其频率" << endl;
cout << "6、单步执行:计算并输出ASL值" << endl;
cout << "7、返回主菜单" << endl;
cout << "请选择你需要的服务,输入数字(1~7):" << endl;
}