当前位置: 首页 > news >正文

C++——哈希结构

1.unordered系列关联式容器

本节主要介绍unordered_map和unordered_set两个容器,底层使用哈希实现的

unordered_map

1.unordered_map是储存<key,value>键值对的关联式容器,其允许通过key快速查找到对应的value,和map非常相似,但是底层实现完全不同

2.unoredered_map没有对<key,value>进行排序,而是映射一个对象,其内容与其键相关联,键和映射值的类型可能不同

2.底层结构

unordered系列的关联式容器之所以效率比较高,是因为底层实现了哈希结构

哈希概念

构造一种储存结构,通过某种函数使元素的储存位置与他的关键码建立一一映射的关系,那么在查找该元素的时候很快就能找到

这个顺序表叫做哈希表,但是还有一个问题,如果插入44会出现什么问题?

哈希冲突

不同关键字通过相同的哈希函数计算出相同的哈希地址,这种现象称为哈希冲突

这种情况我们通常用开放定址法和哈希桶解决

常见哈希函数

常用的除留余数法

就是用我们插入的数据模上哈希表的长度,得出的余数,就是我们得到的插入位置的下标;

哈希表什么时候扩容

开放定址法实现哈希

#pragma once
#include<vector>template<class K>
struct HashFunc
{size_t operator()(const K& key){return (size_t)key;}
};//特化
template<>
struct HashFunc<string>
{size_t operator()(const string& key){size_t hash = 0;for (auto ch : key){hash *= 131;hash += ch;}return hash;}
};namespace open_address
{enum State{EXIST,EMPTY,DELETE};template<class K, class V>struct HashData{pair<K, V> _kv;State _state = EMPTY;};template<class K, class V, class Hash = HashFunc<K>>class HashTable{public:HashTable(){_tables.resize(10);}bool Insert(const pair<K,V>& kv){if (Find(kv.first)){return false;}//扩容if (_n * 10 / _tables.size() >= 7){HashTable<K, V> newHT;newHT._tables.resize(_tables.size() * 2);for (size_t i = 0; i < _tables.size(); i++){if (_tables[i]._state == EXIST){newHT.Insert(_tables[i]._kv);}}_tables.swap(newHT._tables);}Hash hs;size_t hashi = hs(kv.first) % _tables.size();while (_tables[hashi]._state ==EXIST){++hashi;hashi %= _tables.size();}_tables[hashi]._kv = kv;_tables[hashi]._state = EXIST;++_n;return true;}HashData<K, V>* Find(const K& key){Hash hs;size_t hashi = hs(key) % _tables.size();while (_tables[hashi]._state != EMPTY){if (_tables[hashi]._state == EXIST &&_tables[hashi]._kv.first == key){return &_tables[hashi];}++hashi;hashi %= _tables.size();}return nullptr;}bool Erase(const K& key){HashData<K, V>* ret = Find(key);if (ret == nullptr){return false;}else{ret->_state = DELETE;--_n;return true;}}private:vector<HashData<K, V>> _tables;size_t _n = 0;};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 中国县城建设统计年鉴(2015-2022年)
  • 基础算法之模拟
  • RK3568笔记五十二:HC-SR04超声波模块驱动测试
  • modbus控制传感器
  • PHP单例模式详解及应用
  • 使用Python库开发Markdown编辑器并将内容导出为图片
  • 学习笔记-优化问题
  • 正点原子imx6ull-mini-Linux驱动之Linux SPI 驱动实验(22)
  • Netty二
  • 【从零开始一步步学习VSOA开发】搭建VSOA运行环境
  • rust和c传递字符串的七种方法--翻译
  • 【HBZ分享】spring启动时自动装配的位置
  • 基于FPGA的数字信号处理(20)--半减器和全减器
  • PySide6/PyQT学习笔记(很杂)
  • 如何实现element UI循环表单?
  • 时间复杂度分析经典问题——最大子序列和
  • 5、React组件事件详解
  • CSS 三角实现
  • ES6 学习笔记(一)let,const和解构赋值
  • javascript数组去重/查找/插入/删除
  • Java教程_软件开发基础
  • js作用域和this的理解
  • mysql 5.6 原生Online DDL解析
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Object.assign方法不能实现深复制
  • python3 使用 asyncio 代替线程
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue学习系列(二)vue-cli
  • Webpack 4x 之路 ( 四 )
  • 大型网站性能监测、分析与优化常见问题QA
  • 工作中总结前端开发流程--vue项目
  • 首页查询功能的一次实现过程
  • 用jquery写贪吃蛇
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​VRRP 虚拟路由冗余协议(华为)
  • #Linux(帮助手册)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2)STM32单片机上位机
  • (C++17) optional的使用
  • (Charles)如何抓取手机http的报文
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (七)Knockout 创建自定义绑定
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十)T检验-第一部分
  • (循环依赖问题)学习spring的第九天
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)socket Aio demo
  • ***测试-HTTP方法
  • .Net 6.0 处理跨域的方式
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net framework4与其client profile版本的区别
  • .Net Memory Profiler的使用举例