使用开散列实现对字典的查找插入删除(C++实现)

2023-10-27

一、需求分析

问题描述】实现对字典的查找。

基本要求
在分块查找、AVL树、哈希查找、B树或者B+树查找中选择一种你认为最高效的动态查找方法对字典(单词、词性加释义)在内存中的动态查找结构或者在外存的字典文件的构造、查找、插入、删除。

逻辑操作
1、利用字典文件构造字典
2、实现对字典的快速查找
3、在字典中任意插入之前不存在的单词
4、任意删除字典中已有的单词

输入输出要求
1.字典的构造:从字典文本文件中(在程序中更名为Dictionary1.txt)获取百万级别的单词,构造字典
2. 要有字典使用菜单,便利用户。

二、概要设计

(1)选择采用开散列来构造字典,使用链表来避免冲突;根据关键码直接映射找到单词所在的位置,实现快速查找。

(2)使用结构体word来存储单词及其释义,结构体word中有两个字符串,word字符串和meaning字符串。

(3)使用ChainNode结构体来存储链表结点,每个结构体中有数据data(里面存放word结构体,即一个单词),状态state(碑,有状态{ Active, Empty, Deleted },可判断该地址处是否存有数据,是否为空,是否已经被删除等状态)以及链表指针link。

(4)因为测试数据为百万级别的,所以我们开5000的散列,除数取小于5000的最大素数4999,映射地址为为num = 3*num+wd->word[i](循环);num%=4999.

三、详细设计

头文件”word.h”

#include<iostream>
#include<string>
using namespace std;

struct word {
	string word;
	string meaning;
};

头文件“ChainNode.h”

#include"word.h"

enum status { Active, Empty, Deleted };


template<class E, class K>
struct ChainNode {                 //各桶中同义词子表的链结点定义
	E data;
	status state;
	ChainNode<E, K> * link;
};

头文件“hash.h”

const int defaultSize = 5000;    //设置散列大小

1.哈希表类定义

template<class E,class K>
class HashTable {
public:
	HashTable(int d, int sz = defaultSize);
	~HashTable() { delete[]ht; }
	bool CreatHashTable();
	ChainNode<E,K>* Search(const K kl);
	void Insert(const E* wd);
	void Insert(const K kl); //重载
	void Remove(const K kl);
private:
	int TableSize;
	int CurrentSize;
	ChainNode<E, K> * ht;     //散列表定义
};

2.哈希表构造函数

template<class E,class K>
HashTable<E, K>::HashTable(int d, int sz)
{
	//divisor = d;
	TableSize = sz;
	CurrentSize = 0;
	ht = new ChainNode<E, K>[sz];
	assert(ht != NULL);
	for (int i = 0; i < TableSize; i++)
	{
		ht[i].state = Empty;
		ht[i].link = NULL;
	}
}

3.初始化函数

template<class E,class K>
bool HashTable<E, K>::CreatHashTable()
{
	E *wd = new word();
	ifstream Dictionary;
	cout << "字典生成中,请稍后……" << endl;
	Dictionary.open("Dictionary1.txt");
	do {
		Dictionary >> wd->word;
		getline(Dictionary, wd->meaning);
		//cout << wd->word << endl;
		Insert(wd);
		if (wd->word == "zoology128")break;
	} while (1);
	cout << "字典生成成功!" << endl;
	return true;
}

4.初始化专用的插入函数

template<class E,class K>
void HashTable<E, K>::Insert(const E* wd)
{
	int r = 0, num = 0;
	while (wd->word[r] != '\0')
	{
		num = 3*num+wd->word[r];
		r++;
	}
	num %= 4999;
	if (num < 0)
		num = -num;
	if (ht[num].state == Empty)
	{
		ht[num].data = *wd;
		ht[num].state = Active;
		CurrentSize++;
	}
	else
	{
		ChainNode<E, K>* newd = new ChainNode<E, K>();
		newd->data = *wd;
		ChainNode<E, K>*p = &ht[num];
		while (p->link!=NULL)
			p = p->link;
		p->link = new ChainNode<E, K>();
		p->link = newd;
	}
}

5.插入函数

template<class E, class K>
void HashTable<E, K>::Insert(const K kl)
{
	E *wd = new word();
	wd->word = kl;
	int r = 0, num = 0;
	while (wd->word[r] != '\0')
	{
		num = 3 * num + wd->word[r];
		r++;
	}
	num %= 4999;
	if (num < 0)
		num = -num;
	if (ht[num].state == Empty)
	{
		ht[num].data = *wd;
		//ht[num].state = Active;
		CurrentSize++;
	}
	else
	{
		ChainNode<E, K>* newd = new ChainNode<E, K>();
		newd->data = *wd;
		ChainNode<E, K>*p = &ht[num];
		while (p->link != NULL)p = p->link;
		p->link = new ChainNode<E, K>();
		p->link = newd;
	}
	cout << "插入成功!" << endl;
}

6.搜索函数

template<class E,class K>
ChainNode<E, K>* HashTable<E, K>::Search(const K kl)
{
	E *wd = new word();
	wd->word = kl;
	int r = 0, num = 0;
	while (wd->word[r] != '\0')
	{
		num = 3 * num + wd->word[r];
		r++;
	}
	num %= 4999;
	if (num < 0)
		num = -num;
	ChainNode<E, K>*p = &ht[num];
	while (p != NULL && p->data.word != wd->word) 
	{
		if (p->link == NULL)
			return NULL;
		p = p->link;
	}
	return p;
}

7.删除函数

template<class E,class K>
void HashTable<E, K>::Remove(const K kl)
{
	E *wd = new word();
	wd->word = kl;
	int r = 0, num = 0;
	while (wd->word[r] != '\0')
	{
		num = 3 * num + wd->word[r];
		r++;
	}
  	num %= 4999;
	if (num < 0)
		num = -num;
	if (ht[num].state == Empty)
		cout << "字典中不存在这个单词!" << endl;
	else
	{
		ChainNode<E, K>*p = &ht[num];
		ChainNode<E, K>*q = p;
		while (p != NULL && p->data.word != wd->word)
		{
			q = p;
			p = p->link;
		}
		if (p == NULL)
			cout << "字典中不存在这个单词!" << endl;
		else
		{
			q->link = p->link;
			delete p;
			p = NULL;
			p->state = Deleted;
			cout << "已删除该单词!" << endl;
		}
	}
}

测试文件“dictionary.cpp”

#include<iostream>
#include"hash.h"
using namespace std;

int Test()
{
	HashTable<word, string>hash1(1999);
	hash1.CreatHashTable();
	cout << "欢迎使用字典!" << endl;
	cout << "1.搜索" << endl;
	cout << "2.插入" << endl;
	cout << "3.删除" << endl;
	int tmp;
	do {
		cout << "请输入你需要进行的操作(按0退出):" << endl;
		cin >> tmp;
		if (tmp == 1)
		{
			cout << "请输入你需要查找的单词:";
			string a;
			cin >> a;
			ChainNode<word, string>*p;
			p=hash1.Search(a);
			if (p == NULL)
				cout << "字典中没有这个单词!" << endl;
			else
				cout << p->data.word << "	" << p->data.meaning << endl;
		}
		if (tmp == 2)
		{
			cout << "请输入你需要插入的单词:";
			string a;
			cin >> a;
			hash1.Insert(a);
		}
		if (tmp == 3)
		{
			cout << "请输入你需要删除的单词:";
			string a;
			cin >> a;
			hash1.Remove(a);
		}
	} while (tmp);
	return 0;
}
int main()
{
	Test();
	return 0;
}

四、运行截图

在这里插入图片描述
查找和删除操作
在这里插入图片描述
查找、删除和插入操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用开散列实现对字典的查找插入删除(C++实现) 的相关文章

随机推荐

  • php curl 带入cookie,PHP CURL中传递cookie的方法步骤

    curl的cookie怎么使用 新手都很头疼的 curl的参数太多了 其中cookie部分就涉及了4个 当然了 手册上明白写的curl的cookie是3个 但是嘛 不是还有个header的参数嘛 里面可以包含cookie curl非常的好用
  • chatgpt赋能python:Python文件转pyc文件详解

    Python文件转pyc文件详解 Python作为一门程力语言 在软件工程领域中独树一帜 但是Python解释器每次运行程序都会解释Python代码 这种运行方式会降低程序的运行速度 为了避免这种情况的发生 可以将Python文件编译成字节
  • air724UG + Luat玩转物联网(四) 定时器

    luat已经将定时器封装入sys模块 每创建一个任务就会消耗一个定时器 最大不能超过32个 一 luat定时器使用方法 1 sys timerStart fnc ms 开启一个定时器 参数 参数 释义 fnc fnc 定时器回调函数 ms
  • React项目 管理后台页面框架搭建

    使用 antd 这个框架搭建 使用 Layout 进行页面布局 在文件夹 component 创建一个新的组件 叫做Frame 然后里面在创建一个叫做index js 这是我们管理后台的一个大的布局结构 在index js 里添加代码 首先
  • 【拍照画面异常问题的 buffer dump和处理】

    当拍照遇到画面异常问题 建议先dump拍照对应的raw yuv和jpeg 一 Dump拍照对应的raw图 1 Non zsl拍照 Non zsl拍照会让P1node重新出raw图 而拍照会用到这些raw图中的imgo buffer 1 1
  • Pycharm设置终端自动进入当前python环境

    这里写自定义目录标题 设置Pycharm中的Powershell终端 powershell初始化 设置Pycharm中的Powershell终端 使用系统自带powershell的请忽略此步 在设置 工具 终端中设置默认powershell
  • 人生苦短,Python是岸——别了!Python之父!

    就在7月12日 著名的Python之父Guido van Rossum正式退出Python核心决策层 他在邮件里有点生气又有点伤心的写道 现在PEP 572已经完成 我不再想为一个PEP这么努力争取 而且还发现有这么多人鄙视我的决定 这个完
  • label+input 选择(优化多选按钮)及 input实现全选反选

    1 多选 选择之后不同的背景 input中 id和label中 for对应的值必须相同
  • Tomcat 8和10的安装和修改

    Tomcat10 jdk11没有jre目录了 tomcat安装后需要做一些修改 JAVA HOME usr local jdk11 JAVA BIN JAVA HOME bin export JAVA BIN JAVA HOME bin e
  • 全网最全系统学习爬虫教程,用爬虫进行数据分析(bs4,xpath,正则表达式)

    1 bs4解析基础 2 bs4案例 3 xpath解析基础 4 xpath解析案例 4k图片解析爬取 5 xpath解析案例 58二手房 6 xpath解析案例 爬取站长素材中免费简历模板 7 xpath解析案例 全国城市名称爬取 8 正则
  • jwt 非对称加密 密钥生成

    1 生成证书 有效期 100年 2 证书的名称 pubKey 3 证书生成需要的盐值 7018 z1 在java项目中使用rsa非得对称加密 只需要生成的 证书 pubKey jks以及生成的公钥 私钥一般用不到 如果加密和解密只需要公钥和
  • vs2017试用延长期已到_将Windows 7试用版从30天延长到120天

    vs2017试用延长期已到 Did you know that you can install Windows 7 without any license key and use it for 30 days What you might
  • STM32学习心得(二)点亮LED灯

    STM32学习心得 二 点亮LED灯 在创建好工程模板后 就可以开始真正进入STM32的学习 手下那当然是试着点亮一个LED灯 首先在USER目录下创建一个空文件夹 并命名为bsp led bsp的意思是板级支持包 即该代码仅支持这块板子
  • Git搭建个人博客

    Git搭建个人博客 很多人都有写博客的习惯 所以我这篇博客就讲解一下如何在git上搭建一个个人的博客 环境 搭建个人博客需要配置配置一下环境 这里我是使用win10来搭建的 因为像这种配置或者搭建东西 一般都是win系统比较麻烦 在mac和
  • Sqlilabs-16

    相较于第 15 关 单引号变成了双引号 括号 查列 uname admin and if ascii substr select group concat table name from information schema tables
  • bash: /root/.bashrc: 行 102: 语法错误: 未预期的文件结尾

    问题描述 解决方案 在添加内容的末尾加上fi
  • idea使用sonarlint插件

    JDH 邹老板 一 插件安装 由于是内网环境 根据自己安装的idea版本 去官网下载离线插件包进行离线安装 我的idea是IntelliJ IDEA 2020 2 3 安装包如下 二 sonarlint服务器配置 插件安装完成之后 在设置里
  • YaRN: Efficient Context Window Extension of Large Language Models

    本文是LLM系列文章 针对 YaRN Efficient Context Window Extension of Large Language Models 的翻译 YaRN 大型语言模型的有效上下文窗口扩展 摘要 1 引言 2 背景和相关
  • zookeeper版本选择与配置参数调优

    一 zookeeper 发布策略 Apache ZooKeeper 社区一次支持两个发布分支 stable和current ZooKeeper的稳定版本是 3 7 x 当前版本是 3 8 x 一旦发布新的次要版本 稳定版本预计将很快退役 大
  • 使用开散列实现对字典的查找插入删除(C++实现)

    一 需求分析 问题描述 实现对字典的查找 基本要求 在分块查找 AVL树 哈希查找 B树或者B 树查找中选择一种你认为最高效的动态查找方法对字典 单词 词性加释义 在内存中的动态查找结构或者在外存的字典文件的构造 查找 插入 删除 逻辑操作