【每日算法】Day 6-1:哈希表从入门到实战——高频算法题(C++实现)

摘要 :掌握高频数据结构!今日深入解析哈希表的核心原理与设计实现,结合冲突解决策略与大厂高频真题,彻底掌握O(1)时间复杂度的数据访问技术。

一、哈希表核心思想

哈希表(Hash Table) 是一种基于键值对的高效数据结构,通过哈希函数将键映射到存储位置,核心特性:

  • 平均时间复杂度:插入、删除、查找均为O(1)

  • 冲突处理:开放寻址法、链地址法等策略

  • 负载因子:哈希表性能的关键指标(元素数/桶数)

应用场景

  • 快速数据检索

  • 去重操作

  • 缓存系统设计(如LRU Cache)

二、哈希表实现原理

1. 哈希函数设计

理想哈希函数特性

  • 确定性:相同键的哈希值始终相同

  • 均匀性:键值均匀分布到各个桶

  • 高效性:计算速度快

常见哈希函数

  • 除法哈希:hash(key) = key % capacity

  • 乘法哈希:利用黄金分割点

  • 多项式哈希:用于字符串处理

// 字符串哈希示例(多项式滚动哈希)
size_t stringHash(const string& s, size_t mod = 1e9+7) {size_t hash = 0;const size_t base = 31; // 常用质数基数for (char c : s) {hash = (hash * base + c) % mod;}return hash;
}

2. 冲突解决策略

动态示意图

链地址法示意图

策略1:链地址法(Separate Chaining)

// 哈希表节点定义
template <typename K, typename V>
struct HashNode {K key;V value;HashNode* next;HashNode(K k, V v) : key(k), value(v), next(nullptr) {}
};// 哈希表类框架
template <typename K, typename V>
class HashMap {
private:vector<HashNode<K,V>*> buckets;size_t capacity;size_t size;size_t hashFunction(K key) {return hash<K>{}(key) % capacity;}public:HashMap(size_t cap = 16) : capacity(cap), size(0) {buckets.resize(cap, nullptr);}// 插入、查找、删除操作实现...
};

策略2:开放寻址法(Open Addressing)

// 线性探测插入实现
template <typename K, typename V>
void HashMap<K,V>::put(K key, V value) {size_t index = hashFunction(key);while (buckets[index] != nullptr) {if (buckets[index]->key == key) { // 已存在则更新buckets[index]->value = value;return;}index = (index + 1) % capacity; // 线性探测}buckets[index] = new HashNode<K,V>(key, value);size++;
}

三、哈希表操作实现(C++)

1. 插入操作(链地址法)

template <typename K, typename V>
void HashMap<K,V>::put(K key, V value) {size_t index = hashFunction(key);HashNode<K,V>* node = buckets[index];while (node) { // 检查键是否已存在if (node->key == key) {node->value = value;return;}node = node->next;}// 头插法添加新节点HashNode<K,V>* newNode = new HashNode<K,V>(key, value);newNode->next = buckets[index];buckets[index] = newNode;size++;
}

2. 查找操作、

template <typename K, typename V>
V HashMap<K,V>::get(K key) {size_t index = hashFunction(key);HashNode<K,V>* node = buckets[index];while (node) {if (node->key == key) {return node->value;}node = node->next;}throw out_of_range("Key not found");
}

3. 删除操作

template <typename K, typename V>
void HashMap<K,V>::remove(K key) {size_t index = hashFunction(key);HashNode<K,V>* node = buckets[index];HashNode<K,V>* prev = nullptr;while (node) {if (node->key == key) {if (prev) prev->next = node->next;else buckets[index] = node->next;delete node;size--;return;}prev = node;node = node->next;}
}

四、复杂度与优化

操作平均情况最坏情况
插入O(1)O(n)
删除O(1)O(n)
查找O(1)O(n)

优化策略

  • 负载因子监控:当元素数/桶数超过阈值(如0.75),触发扩容

  • 动态扩容:容量扩展为原来的2倍,并重新哈希所有元素

  • 良好的哈希函数选择:减少冲突,提升性能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/74535.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 第29题、30题

LeetCode 第29题&#xff1a;两数相除 题目描述 给你两个整数&#xff0c;被除数dividend和除数divisor。将两数相除&#xff0c;要求不使用乘法、除法和取余运算。整数除法应该向零截断&#xff0c;也就是截去其小数部分。例如&#xff0c;8.345将被截断为8&#xff0c;-2.733…

26考研——树与二叉树_树、森林(5)

408答疑 文章目录 二、树、森林树的基本概念树的定义和特性树的定义树的特性 基本术语树的基本术语和概念祖先、子孙、双亲、孩子、兄弟和堂兄弟结点的层次、度、深度和高度树的度和高度分支结点和叶结点有序树和无序树路径和路径长度 森林的基本术语和概念森林的定义森林与树的…

【HarmonyOS Next之旅】DevEco Studio使用指南(六)

目录 1 -> 在模块中添加Ability 1.1 -> Stage模型添加UIAbility 1.1.1 -> 在模块中添加UIAbility 1.1.2 -> 在模块中添加Extension Ability 2 -> 创建服务卡片 2.1 -> 概述 2.2 -> 使用约束 2.3 -> 创建服务卡片 2.4 -> 创建动态/静态卡片…

Langchain 多模态输入和格式化输出

多模态输入 图片处理&#xff08;最高频&#xff09; 1.1 URL形式&#xff08;推荐大文件&#xff09; from langchain.schema import HumanMessage from langchain.chat_models import ChatOpenAIchat ChatOpenAI(model"gpt-4-vision-preview")message HumanMes…

Excel多级联动下拉菜单的自动化设置(使用Python中的openpyxl模块)

1 主要目的 在Excel中&#xff0c;经常会遇到需要制作多级联动下拉菜单的情况&#xff0c;要求单元格内填写的内容只能从指定的多个选项中进行选择&#xff0c;并且需要设置多级目录&#xff0c;其中下级目录的选项内容要根据上级目录的填写内容确定&#xff0c;如下图所示&am…

3.25-1 postman执行+弱网测试

1.导出json脚本 2.打包json文件 3.下载的文件 二 .导入脚本 选择文件 点击导入 导入的接口 三.多接口运行 &#xff08;1&#xff09;集合右键&#xff0c;点击run &#xff0c;运行多个接口 2.编辑环境&#xff0c;集合&#xff0c;执行次数等 运行多个接口 四.运行多个接口…

Pear Admin Flask 开发问题

下载代码请复制以下命令到终端执行 git clone https://gitee.com/pear-admin/pear-admin-flask 于是我下载git 完成安装后&#xff1a; 安装 Git 后出现的页面是 “Git for Windows 的版本发布说明&#xff08;Release Notes&#xff09;”&#xff0c;通常会在安装完成后自动弹…

12-scala样例类(Case Classes)

例类&#xff08;Case classes&#xff09;和普通类差不多&#xff0c;只有几点关键差别&#xff0c;接下来的介绍将会涵盖这些差别。样例类非常适合用于不可变的数据。 定义一个样例类 一个最简单的样例类定义由关键字case class&#xff0c;类名&#xff0c;参数列表&#…

cmakelist中添加opencv

版本选择 qt的msvc&#xff0c;版本2019 opencv版本 4.5.3 配置了环境变量 x64下的v14中的bin 配置头文件 {"configurations": [{"name": "Win32","includePath": ["${workspaceFolder}","d:\\QT\\6.5.3\\msvc20…

【C语言】文件操作(详解)

个人主页 今天我们来讲一下有关文件的相关操作&#xff0c;希望看完这篇文章对你有所帮助&#xff0c;大力感谢你对博主的支持&#xff01; 文章目录 ⭐一、为什么使用文件&#x1f389;二、什么是文件2.1 程序文件2.2 数据文件2.3 文件名 &#x1f3a1;三、二进制文件和文本…

基于web的家政服务网站

内容摘要 由于互联网的使用&#xff0c;人们在管理、应用、服务等领域使用数据更加简洁、方便&#xff0c;大大提高了工作效率。互联网正逐渐融入我们的生活&#xff0c;影响和改变我们的生活。 家政服务管理系统是典型的信息管理系统&#xff08;MIS&#xff09;。其开发主要…

【leetcode hot 100 739】每日温度

解法一&#xff1a;暴力解法 class Solution {public int[] dailyTemperatures(int[] temperatures) {int ntemperatures.length; // 指向要找下一个更高温度的地方int[] result new int[n];for(int left0;left<n;left){int rightleft1; // 指向正在找最高温度的地方wh…

蓝桥杯C++基础算法-0-1背包(优化为一维)

这段代码实现了0-1 背包问题的动态规划解法&#xff0c;并且使用了滚动数组来优化空间复杂度。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&#xff0c;每个物品有其体积 v[i] 和价值 w[i]&#xff0c;以及一个容量为 m 的背包。目标是选择物品使得总价值…

算法 | 麻雀搜索算法原理,公式,改进算法综述,应用场景及matlab完整代码

一、麻雀搜索算法(SSA)原理 1. 算法基础 麻雀搜索算法(Sparrow Search Algorithm, SSA)是2020年提出的一种群体智能优化算法,灵感来源于麻雀群体的觅食与反捕食行为。算法将麻雀分为三类角色:发现者(Producer):适应度最高,负责探索全局最优区域;加入者(Follower)…

SQL 版本历史

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库的标准语言。SQL标准由多个组织制定和维护&#xff0c;主要包括以下几个版本&#xff1a; SQL-86 (SQL-87): 这是SQL的第一个官方标准&#xff0c;由ANSI&#xff08;美国国家标准协会&…

CAT1模块 EC800M HTTP 使用后续记录

记录一下 CAT1 模块EC800 HTTP 使用后续遇到的问题 by 矜辰所致目录 前言一、一些功能的完善1.1 新的交互指令添加1.2 连不上网络处理 二、问题出现三、分析及解决3.1 定位问题3.2 问题分析与解决3.2.1 查看变量在内存中的位置 3.3 数据类型说明3.3.1 常用格式化输出符号…

单纯形法之大M法

1. 问题背景与标准化 在求解某些线性规划问题时&#xff0c;往往难以直接找到初始的基本可行解。特别是当约束中存在等式或 “≥” 类型的不等式时&#xff0c;我们需要引入人工变量来构造一个初始可行解。 考虑如下标准形式问题&#xff08;假设为最大化问题&#xff09;&am…

Springboot集成Debezium监听postgresql变更

1.创建springboot项目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…

报错 standard_init_linux.go:228: exec user process caused: exec format error

docker logs 容器名 报错&#xff1a; standard_init_linux.go:228: exec user process caused: exec format error 或者 standard_init_linux.go:228: exec user process caused: input/output error 排查思路 1、检查源镜像的框架是否正确&#xff0c;是否amd64&#x…

Go 代理爬虫

现在注册&#xff0c;还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器&#xff0c;通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支&#xff1a; basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…