第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++数据结构(九)散列表相关推荐

  1. 数据结构之散列表(七)

    前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...

  2. 数据结构四——散列表(上)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...

  3. 数据结构四——散列表(下)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 7 散列表+链表的应用 很多情况下散列表会和链表一起使用.散列表可以通过key查找value.链表可以按 ...

  4. 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...

    散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...

  5. 数据结构(55) 散列表(哈希表,hash table,hash map)

    目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...

  6. 【数据结构】散列表知识点

    散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...

  7. 大话数据结构:散列表

    基础介绍 是一种存储结构,就是构建一个函数,以输入的关键字作为自变量,以地址作为因变量.具体实现有很多变种. 代码 #include "stdio.h" #include &quo ...

  8. 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

    散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...

  9. Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现

    分离链接法 / Separate Chain Hashing 前面完成了一个基本散列表的实现,但是还存在一个问题,当散列表插入元素冲突时,散列表将返回异常,这一问题的解决方式之一为使用链表进行元素的存 ...

最新文章

  1. HttpServletResponse对象(一)
  2. 查看自己的ip和采用什么方式上网(网通/电信)
  3. JavaScript表单验证,输入中文时字符长度为2
  4. asp:HyperLink vs asp:LinkButton
  5. 键盘显示影响布局的解决方法
  6. Android 面试题总结
  7. 大润发java薪资,大润发edp员工面试:不说位置了,怕备查,哈哈 第一次去是因 - 职朋职业圈...
  8. java 复制标记_java-对于大文件,在标记inputStream并将其重置...
  9. 为什么不能完全相信自动驾驶?
  10. 华量杯-股票预测, keras+LSTM
  11. 再见了我热爱的ACM赛场
  12. 如何使用@PostConstruct初始化敏感词库和hutool过滤敏感词信息
  13. Pytorch GAN实战 MINIST手写数字识别分布解析
  14. 代码检查技术Checkstyle与p3c调研
  15. 写作专用各种表情和符号,使你的文章更加美观有趣!❤️❤️❤️
  16. MATLAB解决线性最小二乘拟合
  17. 安装EPICS窗口显示工具MEDM和EDM
  18. GII全球创新指数(2011-2018年)
  19. Vega Prime 常见问题集
  20. 特征选择(Feature Selection)

热门文章

  1. 基于JAVA水质监测数据采集系统计算机毕业设计源码+数据库+lw文档+系统+部署
  2. AWS ALB ELB
  3. 普中科技单片机HC6800-EM3 V3.0资料下载
  4. 从零开始编写自己的C#框架(8)——后台管理系统功能设计
  5. 我国社保待遇标准将逐步与物价挂钩
  6. .NET版支付宝商户会员卡接入
  7. 火山中文编程 -- MD5算法和SHA算法
  8. 3D查找表(3D LUT)说明
  9. java以下声明变量中 是不合法的_java考试复习题
  10. Intellij Idea 好用插件之GsonFormat