第99篇 C++数据结构(九)散列表
第99篇 C++数据结构(九)散列表
- 1.散列表简介
- 1.1.散列函数
- 1.2.散列冲突解决方案
- 2.数据节点
- 3.实现
- 3.1.变量
- 3.2.方法
- 4.测试
- 4.1.测试代码
- 4.2.输出结果
- 5.实现代码
- 6.总结
详细介绍:
大佬文章链接1
大佬文章链接2
1.散列表简介
散列表也叫哈希表(Hash table),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
1.1.散列函数
散列函数设计的基本要求:
散列函数计算得到的散列值是一个非负整数;
如果 key1 = key2,那 hash(key1) == hash(key2);
如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。(往往这个条件很难办到,key不同可能出现相同的散列值,于是出现散列冲突)
1.2.散列冲突解决方案
大佬文章链接1
大佬文章链接2
2.数据节点
为了方便操作,把数据和属性封装起来。因为存储数据,所以不好用某个值来判断散列表某个位置是否有数据,因此添加一个hasValue属性,用于判断某个位置是否有值,添加remove属性,用于删除某个值之后,出现表断裂的情况(查找的时候,是遇到没有值的地方就停止,如果这个地方被删除,那还可以继续查找)。
struct Node
{int m_value;bool m_hasValue;bool m_remove;Node() : m_value(0), m_remove(false), m_hasValue(false) {}Node(int value) : m_value(value), m_remove(false), m_hasValue(true) {}
};
3.实现
3.1.变量
变量名 | 类型 | 属性 | 说明 |
---|---|---|---|
m_hashTable | std::vector | 私有 | 数据散列表 |
m_size | int | 私有 | 散列表长度 |
3.2.方法
方法名 | 返回类型 | 参数 | 属性 | 说明 |
---|---|---|---|---|
HashTable() | - | int size | 公有 | 构造长度为size的散列表 |
size() const | int | - | 公有 | 返回散列表长度 |
add() | bool | int value | 公有 | 添加数据 |
remove() | bool | int value | 公有 | 删除数据 |
serch() | bool | int value | 公有 | 查找数据 |
full() const | bool | - | 公有 | 判断散列表是否为满 |
hashFunc() | int | int key | 保护 | 散列函数 |
4.测试
4.1.测试代码
#include <iostream>#include "hashtable.h"int main()
{HashTable hashtable(8);std::cout << "\n添加8个数据:" << std::endl;for (int i = 0; i < 8; i++){hashtable.add(i * 7 + 1);}hashtable.print();std::cout << "\n添加34:" << std::endl;hashtable.add(34);hashtable.print();std::cout << "\n添加45:" << std::endl;hashtable.add(45);hashtable.print();std::cout << "\n删除100:" << std::endl;hashtable.remove(100);hashtable.print();std::cout << "\n查找34:" << std::endl;if (hashtable.serch(34)){std::cout << "34在表里" << std::endl;}else{std::cout << "34不在表里" << std::endl;}std::cout << "\n查找35:" << std::endl;if (hashtable.serch(35)){std::cout << "35在表里" << std::endl;}else{std::cout << "35不在表里" << std::endl;}return 0;
}
4.2.输出结果
添加8个数据:
8, 1, 50, 43, 36, 29, 22, 15,添加34:
36, 1, 29, 34, 22, 50, 15, 43, 8,添加45:
50, 1, 22, 43, 34, 15, 36, 45, 8, 29,删除100:
50, 1, 22, 43, 34, 15, 36, 45, 8, 29,查找34:
34在表里查找35:
35不在表里
5.实现代码
#pragma once
#ifndef _HASHTABLE_H_
#define _HASHTABLE_H_#include <iostream>
#include <vector>struct Node
{int m_value;bool m_hasValue;bool m_remove;Node() : m_value(0), m_remove(false), m_hasValue(false) {}Node(int value) : m_value(value), m_remove(false), m_hasValue(true) {}
};class HashTable
{public:HashTable(int size){if (size > 0){m_hashTable = std::vector<Node>(size);m_size = size;}else{m_size = 0;}}int size() const{return m_size;}bool add(int value){if (full()){m_size++;std::vector<Node> newHashTable(m_size);for (int i = 0; i < m_size - 1; i++){int index = hashFunc(m_hashTable[i].m_value);while (newHashTable[index].m_hasValue){index = (index + 1) % m_size;}newHashTable[index].m_hasValue = true;newHashTable[index].m_remove = false;newHashTable[index].m_value = m_hashTable[i].m_value;}m_hashTable = newHashTable;}int index = hashFunc(value);while (m_hashTable[index].m_hasValue){index = (index + 1) % m_size;}m_hashTable[index].m_hasValue = true;m_hashTable[index].m_remove = false;m_hashTable[index].m_value = value;return true;}bool remove(int value){int index = hashFunc(value);int count = 0;while ((m_hashTable[index].m_hasValue || m_hashTable[index].m_remove) && m_hashTable[index].m_value != value && count < m_size){index = (index + 1) % m_size;count++;}if (index < m_size && m_hashTable[index].m_hasValue && m_hashTable[index].m_value == value){m_hashTable[index].m_hasValue = false;m_hashTable[index].m_remove = true;return true;}return false;}bool serch(int value){int index = hashFunc(value);int count = 0;while ((m_hashTable[index].m_hasValue || m_hashTable[index].m_remove) && m_hashTable[index].m_value != value && count < m_size){index = (index + 1) % m_size;count++;}if (index < m_size && m_hashTable[index].m_hasValue && m_hashTable[index].m_value == value){return true;}return false;}bool full() const{for (int i = 0; i < m_size; i++){if (!m_hashTable[i].m_hasValue){return false;}}return true;}void print() const{for (Node node : m_hashTable){if (node.m_hasValue){std::cout << node.m_value << ", ";}else{std::cout << " " << ", ";}}std::cout << std::endl;}protected:int hashFunc(int key){return abs(key % m_size);}private:std::vector<Node> m_hashTable;int m_size;
};#endif // !_HASHTABLE_H_
6.总结
只是简单的实现,初次接触,如有错误,还望谅解。
第99篇 C++数据结构(九)散列表相关推荐
- 数据结构之散列表(七)
前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...
- 数据结构四——散列表(上)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...
- 数据结构四——散列表(下)
文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...
- 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...
散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...
- 数据结构(55) 散列表(哈希表,hash table,hash map)
目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...
- 【数据结构】散列表知识点
散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...
- 大话数据结构:散列表
基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...
- 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)
散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...
- Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现
分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...
最新文章
- HttpServletResponse对象(一)
- 查看自己的ip和采用什么方式上网(网通/电信)
- JavaScript表单验证,输入中文时字符长度为2
- asp:HyperLink vs asp:LinkButton
- 键盘显示影响布局的解决方法
- Android 面试题总结
- 大润发java薪资,大润发edp员工面试:不说位置了,怕备查,哈哈 第一次去是因 - 职朋职业圈...
- java 复制标记_java-对于大文件,在标记inputStream并将其重置...
- 为什么不能完全相信自动驾驶?
- 华量杯-股票预测, keras+LSTM
- 再见了我热爱的ACM赛场
- 如何使用@PostConstruct初始化敏感词库和hutool过滤敏感词信息
- Pytorch GAN实战 MINIST手写数字识别分布解析
- 代码检查技术Checkstyle与p3c调研
- 写作专用各种表情和符号,使你的文章更加美观有趣!❤️❤️❤️
- MATLAB解决线性最小二乘拟合
- 安装EPICS窗口显示工具MEDM和EDM
- GII全球创新指数(2011-2018年)
- Vega Prime 常见问题集
- 特征选择(Feature Selection)