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

C++ 哈希表

1. 哈希表的概念

在vector、list的顺序结构中,查找效率为 O ( N ) O(N) O(N),在set、map的树型结构中,查找效率为 O ( l o g 2 N ) O(log_2{N}) O(log2N),有没有更优的结构 —— 哈希表

如果让数据按照某种规则映射到某个值,而这个值又是数组的下标,这样,数组的下标与数据之前就建立起了一种关系;查找时,按照相同的规则,自然就能指定的数据,其效率达到 O ( 1 ) O(1) O(1)

接下来,问题就变成如何规定映射关系?

最容易想到的:就让数组下标本身作为映射关系,存储的值与其下标相同

这样方便而简单,但却有很大的缺陷:如果数据中的最大值与最小值相差很大,而数据个数又很少,那么实际上大部分空间都是浪费了

在这里插入图片描述

有没有一种即能将数据映射到数组中的每一个位置,又尽量的少浪费空间的方法,这里给出的方法是除留余数法

将要存储数据的 值 % 数组的大小,得到的就是数据实际存储的位置

在这里插入图片描述

上述过程中,数据与数组下标之间的映射关系的计算方法叫做哈希算法/哈希函数,而以这种方式存储数据的数组叫做哈希表

当然,如果仅仅使用除留余数法的话,仍存在问题:

  1. 数据的个数 > 数组的容量时,根据鸽巢原理,一定会有两个数据映射到同一个下标,如何解决?
  2. 如果要存储的数据不是整形,而是字符串,不就不能进行取余操作了吗,如何解决?

对于两个数据映射到同一个下标的问题,我们称为哈希冲突

解决哈希冲突主要有两种方法:

  1. 闭散列:开放定址法
  2. 开散列:哈希桶

开放定址法的策略是:当新插入的数据与原数据发生哈希冲突时,按照特定的方法寻找空的位置给新插入数据

这里特定的方法主要有两种:

  • 线性探测
  • 二次探测

哈希桶的策略是:哈希表中的每个位置都是一个桶结构,当新插入数据与原数据发生冲突时,直接挂到当前桶下

而对于要存储的数据不能进行取余操作,只需再构建一层映射关系,比如string,我们让string映射到某个整数,再让这个整数映射到哈希表的下标即可

2. 哈希表的实现

开放定址法

这里主要讲解线性探测

使用开放定址法解决哈希冲突时,哈希表中每个位置的初始值应该多少?好像是几都不合适,因为不管是几,遍历到该位置时,这个位置到底是空、已经删除,还是有数据无法确认;因此,每个位置还需要添加一个状态标记

enum Status
{EXIST,EMPTY,DELETE
};template<typename K, typename V>
struct HashData
{HashData() = default;HashData(const pair<K, V>& kv):_kv(kv){}pair<K, V> _kv;Status _status = EMPTY;
};

插入的流程:首先根据除留余数法计算它映射到的位置,如果该位置已有数据,往后找,直到为空

在这里插入图片描述

当然,如果哈希表中的数据过多,冲突的概率也就变大,遍历的次数就会越来越多,效率就变低

因此,什么时候进行扩容就十分关键,这里提出负载因子的概念,负载因子 = 有效数据个数 / 表的大小,当负载因子超过某个值时,进行扩容

如何选定负载因子的临界值?如果该值过小,比如0.5,意味着哈希表中总会有50%的空间被浪费,如果过大,哈希表的整体效率就会变低

这里选定0.7作为负载因子的临界值,即当负载因子超过0.7时,进行扩容

当然,插入数据的前提是该数据不在哈希表中;因此,插入之前先查找

至于删除,可以利用查找,找到后直接将数据的状态啊置为DELETE即可

template<typename K, typename V>
class HashTable
{
public:HashTable(){_table.resize(5);}bool insert(const pair<K, V>& kv){if (find(kv.first)) return false;// 当负载因子 > 0.7 时,进行扩容if (_n * 10 / _table.size() > 7){size_t newsize = _table.size() * 2;HashTable newtable;newtable._table.resize(newsize);for (int i = 0; i < _table.size(); i++){if (_table[i]._status == EXIST){newtable.insert(_table[i]._kv);}}_table.swap(newtable._table);}size_t pos = kv.first % _table.size();while (_table[pos]._status == EXIST){pos++;pos %= _table.size();}_table[pos]._kv = kv;_table[pos]._status = EXIST;_n++;return true;}HashData<K, V>* find(const K& key){size_t pos = key % _table.size();while (_table[pos]._status != EMPTY){if (_table[pos]._kv.first == key && _table[pos]._status != DELETE){return &_table[pos];}pos++;pos %= _table.size();}return nullptr;}void erase(const K& key){HashData<K, V>* res = find(key);if (res == nullptr) return;res->_status = DELETE;_n--;}private:vector<HashData<K, V>> _table;size_t _n = 0;
};

线性探测的缺点:

  • 当发生冲突时,会往后找空的位置,这样会导致数据堆积在一起,一旦堆积的数据过多,发生冲突时往后寻找空位置的效率也就越低,哈希表的整体效率也就越低

如何缓解线性探测带来的问题?二次探测,即发生冲突时,往后以2的次方的间隔查找空的位置

哈希桶

哈希表的另一种实现方式,哈希桶,也是 STL unordered_set/map底层使用的数据结构

哈希表每个位置不再是一个个的数据,而是一个桶结构,下面可以挂载许多数据

当插入数据时,同样根据除留余数法计算出映射的位置,不同的是,发生冲突时,直接将冲突的数据挂到当前桶下即可

在这里插入图片描述

同时规定,当负载因子为1时才进行扩容,相当于平均每个桶下都有一个节点

而扩容的逻辑,我们不再遍历原哈希表,遇到一个节点就开一个新节点,挂到新哈希表下,直接遍历原哈希表,计算映射位置后,将节点的指针直接挂到新哈希表下,然后将原哈希表与新哈希表交换即可

同样的,在插入之前先查找;而删除的操作,自然也是十分简单了

template<typename K, typename V>
struct HashNode
{HashNode() = default;HashNode(const pair<K, V>& kv):_kv(kv){}using Node = HashNode<K, V>;pair<K, V> _kv;Node* _next = nullptr;
};template<typename K, typename V>
class HashTable
{
public:using Node = HashNode<K, V>;HashTable(){_table.resize(5, nullptr);}bool insert(const pair<K, V>& kv){if (this->find(kv.first)) return false;// 当负载因子为 1 时,进行扩容if (_n / _table.size() == 1){size_t newsize = _table.size() * 2;vector<Node*> newtable(newsize, nullptr);for (int i = 0; i < _table.size(); i++){Node* cur = _table[i];while (cur){Node* next = cur->_next;size_t pos = cur->_kv.first % newtable.size();cur->_next = newtable[pos];newtable[pos] = cur;cur = next;}_table[i] = nullptr;}_table.swap(newtable);}size_t pos = kv.first % _table.size();Node* newnode = new Node(kv);newnode->_next = _table[pos];_table[pos] = newnode;_n++;return true;}Node* find(const K& key){size_t pos = key % _table.size();Node* cur = _table[pos];while (cur){if (cur->_kv.first == key) return cur;cur = cur->_next;}return nullptr;}void erase(const K& key){size_t pos = key % _table.size();Node* cur = _table[pos], * prev = nullptr;while (cur){if (cur->_kv.first == key){Node* next = cur->_next;if (prev == nullptr) _table[pos] = next;else prev->_next = next;delete cur;return;}else{prev = cur;cur = cur->_next;}}}private:vector<Node*> _table;size_t _n = 0;
};

任意类型的映射

到目前为止,我们只完成了int类型的映射关系,如果是自定义类型,并不支持取余操作,该如何进行映射?

再构建一层映射关系,将不支持取余操作的类型映射为int,再对该int值进行取余操作

采用仿函数的方式,给哈希表传递一个仿函数,该仿函数完成任意一个类型映射成整形的操作

使用何种哈希算法将自定义类型映射为整数?那string举例,我们可以将所有字符的ASCII字符相加,作为其映射的整形,但这样做冲突率很高

实际上,专家们研究过,如何将字符串映射为整形,而又保证了其冲突率较低

其中较为著名的是BKDR算法,将结果与31/131/1313…相乘后再与字符串的ASCII相加,得到的结果冲突率是比较低的

我们使用模板的特化将字符串的哈希算法单独处理,将该仿函数作为哈希表的模板参数传入

如果有自定义类型想要映射成整数,也能够这样处理

template<typename K>
struct HashFunc
{size_t operator()(const K& key){return (size_t)key;}
};template<>
struct HashFunc<string>
{size_t operator()(const string& s){size_t ans = 0;for (auto& e : s){ans *= 131;ans += e;}return ans;}
};
template<typename K, typename V, typename Hash = HashFunc<K>>
class HashTable
{
public:using Node = HashNode<K, V>;HashTable(){_table.resize(5, nullptr);}bool insert(const pair<K, V>& kv){if (this->find(kv.first)) return false;Hash hash;// 当负载因子为 1 时,进行扩容if (_n / _table.size() == 1){size_t newsize = _table.size() * 2;vector<Node*> newtable(newsize, nullptr);for (int i = 0; i < _table.size(); i++){Node* cur = _table[i];while (cur){Node* next = cur->_next;size_t pos = hash(cur->_kv.first) % newtable.size();cur->_next = newtable[pos];newtable[pos] = cur;cur = next;}_table[i] = nullptr;}_table.swap(newtable);}size_t pos = hash(kv.first) % _table.size();Node* newnode = new Node(kv);newnode->_next = _table[pos];_table[pos] = newnode;_n++;return true;}Node* find(const K& key){Hash hash;size_t pos = hash(key) % _table.size();Node* cur = _table[pos];while (cur){if (cur->_kv.first == key) return cur;cur = cur->_next;}return nullptr;}void erase(const K& key){Hash hash;size_t pos = hash(key) % _table.size();Node* cur = _table[pos], * prev = nullptr;while (cur){if (cur->_kv.first == key){Node* next = cur->_next;if (prev == nullptr) _table[pos] = next;else prev->_next = next;delete cur;return;}else{prev = cur;cur = cur->_next;}}}private:vector<Node*> _table;size_t _n = 0;
};

相关文章:

C++ 哈希表

1. 哈希表的概念 在vector、list的顺序结构中&#xff0c;查找效率为 O ( N ) O(N) O(N)&#xff0c;在set、map的树型结构中&#xff0c;查找效率为 O ( l o g 2 N ) O(log_2{N}) O(log2​N)&#xff0c;有没有更优的结构 —— 哈希表 如果让数据按照某种规则映射到某个值&a…...

【pytorch学习】土堆pytorch笔记1

学习参考 仓库 https://github.com/xiaotudui/pytorch-tutorialhttps://github.com/xiaotudui/pytorch-tutorial https://github.com/AccumulateMore/CV 参考博客 https://blog.csdn.net/weixin_44216612/article/details/124203730? https://www.morinha.cc/posts/cours…...

使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧

使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) video_num 0f…...

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下&#xff1a; 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…...

毕业论文设计基本内容和要求:

毕业设计基本内容和要求&#xff1a; 研究内容 调查了解LAMP架构和PHP开发&#xff1b; 学习百度旅游调用的其他产品线服务并熟悉请求接口&#xff1b; 学习社区业务层规范&#xff1b; 设计并实现旅游主要模块&#xff1b; 技术指标 熟悉企业中流程运转的方式&#xff0c;…...

XML内容解析成实体类

XML解析成实体类 解析方法实体类测试 说明&#xff1a;直接上干货&#xff0c;不废话 解析方法 public static List<PlatJuMinBaoXian> parse(String xmlString) {List<PlatJuMinBaoXian> result new ArrayList<>();try {// 创建 DocumentBuilderDocumentB…...

推公式——耍杂技的牛

由图可知&#xff0c;只要存在一个逆序&#xff0c;把他们交换一下&#xff0c;最大风险值就会降低&#xff0c;答案更优&#xff0c;因此最优解是按照wisi从小到大升序排列&#xff0c;顺次计算每头牛的危险系数&#xff0c;最大值即是答案。 #include <iostream> #inc…...

Vue指令详解:从入门到精通

前言 Vue.js作为当下最流行的前端框架之一&#xff0c;其指令系统是Vue最核心的特性之一。指令是Vue模板中带有v-前缀的特殊属性&#xff0c;它们为HTML元素添加了特殊的响应式行为。本文将全面介绍Vue的各种指令及其用法。 一、Vue指令概述 Vue指令是带有v-前缀的特殊属性&…...

准确--CentOS 7 配置 Chrony 同步阿里云 NTP 时间服务器及手动同步指南

本文档介绍如何在 CentOS 7 系统上配置 chrony 服务&#xff0c;使其与阿里云 NTP 时间服务器保持时间同步&#xff0c;并说明如何在需要时手动触发一次立即同步。 前提条件: 拥有一台 CentOS 7 服务器。拥有 root 权限或可以使用 sudo 命令。服务器可以访问互联网 (使用公共…...

CLIP | 训练过程中图像特征和文本特征的在嵌入空间中的对齐(两个投影矩阵的学习)

在多模态学习&#xff08;Multimodal Learning&#xff09;中&#xff0c;投影矩阵 W i W_i Wi​ 和 W t W_t Wt​ 是通过训练过程学习得到的。它们的作用是将图像特征 I f I_f If​ 和文本特征 T f T_f Tf​ 映射到一个共享的嵌入空间&#xff08;embedding space&#xf…...

Spring中配置 Bean 的两种方式:XML 配置 和 Java 配置类

在 Spring 框架中,配置 Bean 的方式主要有两种:XML 配置 和 Java 配置类。这两种方式都可以实现将对象注册到 Spring 容器中,并通过依赖注入进行管理。本文将详细介绍这两种配置方式的步骤,并提供相应的代码示例。 1. 使用 XML 配置的方式 步骤 创建 Spring 配置文件 创建…...

STM32 外部中断

引言&#xff1a;嵌入式系统中的中断革命 在嵌入式系统开发领域&#xff0c;中断机制堪称现代微控制器的"神经系统"。它通过高效的异步事件处理机制&#xff0c;彻底改变了传统轮询式系统资源利用率低下的局面。STM32作为业界领先的ARM Cortex-M系列微控制器&#x…...

4.22学习总结

开始写有关图的算法 图的一些基本概念&#xff0c;图的存储主要以 邻接矩阵&#xff0c;邻接表&#xff08;数组链表的实现方式&#xff09;的方式存储 邻接矩阵的优点&#xff1a; 表达方式简单&#xff0c;易于理解检查任意两个顶点间是否存在边的操作非常快适合稠密图&a…...

list底层原理

一.结构体的构建 这个用结构体更好&#xff0c;因为我们需要不断的访问节点&#xff0c;类中的成员函数一般都是私有的&#xff0c;需要还用友元函数什么的。 这个是我们来实现的类&#xff0c;我们实现的是双向带头循环链表&#xff0c;这个是实用性最高的一个链表的形式。 这…...

python+selenium+pytest自动化测试chrome driver版本下载

chrome浏览器chromedriver版本下载地址 https://googlechromelabs.github.io/chrome-for-testing/#stable...

发布一个npm包,更新包,删除包

发布一个npm包&#xff0c;更新包&#xff0c;删除包 如何将自己的项目 发布为一个 npm 包&#xff0c;并掌握 更新 和 删除 的操作流程。 &#x1f680; 一、发布一个 npm 包的完整流程 ✅ 1. 注册并登录 npm 账号 如果还没有账号&#xff0c;先注册&#xff1a; 官网注册&…...

代码随想录训练营38天 || 322. 零钱兑换 279. 完全平方数 139. 单词拆分

322. 零钱兑换 思路&#xff1a; 动规5部曲&#xff1a; 1.确定dp数组以及下标的含义&#xff1a; dp数组表示能凑出零钱的最少硬币数&#xff0c;下标表示要兑换的零钱 2.确定递推公式&#xff1a; j为背包容量&#xff0c;i为物品的下标 dp[ j ] min(dp[ j -coins[ i…...

(最新)华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—(共14套)(每套四十题)

&#xff08;最新&#xff09;华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—&#xff08;共14套&#xff09;&#xff08;每套四十题&#xff09; 本套题目为硬件通用题目&#xff0c;适合多个岗位方向&#xff0c;如下 **岗位——硬件技术工程师 岗位意向…...

IOT项目——DIY Weather Station With ESP32

开源项目&#xff1a;ESP32 气象站 作者&#xff1a;GiovanniAggiustatutto 原文链接&#xff1a; ESP32 气象站 温度设备塔风向标风速计雨量计框架电子元件和压力传感器家庭助理配置及应用 气象站测量温度、湿度、气压、风速和风向以及降雨量。所有数据均由 ESP32收集&#xf…...

表格识别版面还原分析-GO语言集成-表格文字识别接口

数据驱动的时代&#xff0c;高效处理和分析各类文档中的信息变得尤为重要。无论是金融服务中的报表分析&#xff0c;制造与物流行业的库存管理&#xff0c;还是医疗卫生领域的病历记录&#xff0c;快速准确地将纸质或电子表格中的数据转换为可编辑、保存的电子数据成为提升工作…...

文件上传漏洞3

1. 例题:文件上传限制 1&#xff09;上传漏洞靶场介绍 项目名称: upload-labs开发语言: 使用PHP语言编写功能定位: 专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场关卡数量: 目前共21关&#xff0c;每关包含不同上传方式注意事项: 每关没有固定通关方法&#xff0c;不要自限…...

一洽智能硬件行业解决方案探索与实践

一、智能硬件行业发展现状剖析 在数字化浪潮推动下&#xff0c;智能硬件行业呈现蓬勃发展态势。软硬件一体化的深度融合&#xff0c;构建起智能化服务的核心架构&#xff0c;而移动应用作为连接用户与设备的重要桥梁&#xff0c;其作用愈发关键。深入研究该行业&#xff0c;可…...

什么是snmp协议?在优雅草星云智控AI物联网监控系统中如何添加设备进行监控【星云智控手册01】-优雅草卓伊凡

什么是snmp协议&#xff1f;在优雅草星云智控AI物联网监控系统中如何添加设备进行监控【星云智控手册01】-优雅草卓伊凡 优雅草星云智控物联网设备 本产品即将在5月15日在优雅草科技的承办下召开产品发布会&#xff0c;本产品需要报名参加可以通过活动行搜索星云智控进行报名…...

神经网络权重优化秘籍:梯度下降法全解析(五)

引言 在神经网络的训练过程中&#xff0c;权重更新是提升模型性能的关键环节&#xff0c;而梯度下降法及其优化算法则是实现这一关键环节的核心工具。理解并掌握这些方法&#xff0c;对于打造高效的神经网络模型至关重要。本文将深入剖析梯度下降法在神经网络权重更新中的应用…...

输入框仅支持英文、特殊符号、全角自动转半角 vue3

需求&#xff1a;封装一个输入框组件 1.只能输入英文。 2.输入的小写英文自动转大写。 3.输入的全角特殊符号自动转半角特殊字符 效果图 代码 <script setup> import { defineEmits, defineModel, defineProps } from "vue"; import { debounce } from "…...

Python简介与入门

目录 Python初始 Python的优势 Python 的特性 Linux下安装Python windows 系统安装python Python的语法基础 标识符 注释 语句与缩进 Python 常用的数据类型 数字 字符串 列表 列表的定义 列表的取值 重复列表 元组 元组的操作 字典 字典的创建 字典的取值操作 字典的添加、…...

C++学习笔记(三十六)——STL之排序算法

一、STL 算法 C的STL&#xff08;Standard Template Library&#xff09; 提供了一组高效、通用的算法&#xff0c;这些算法适用于各种容器&#xff08;如 vector、list、set、map&#xff09;。 这些算法主要位于 <algorithm> 和 <numeric> 头文件中。 通用性&a…...

G1 人形机器人软件系统架构与 Python SDK

如果说人形机器人的硬件是它的“身体”&#xff0c;那么软件系统就是它的“大脑”和“神经系统”&#xff0c;负责接收信息、进行决策并控制身体行动。理解 G1 机器人的软件架构&#xff0c;特别是如何通过编程接口与其交互&#xff0c;是进行机器人开发的核心。本节将剖析 G1 …...

Redis在SpringBoot中的使用

在SpringBoot项目中使用redis存储数据作为字典 本项目使用jdk1.8 一、添加依赖 <!-- spring boot redis缓存引入 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…...

SuperMap GIS基础产品FAQ集锦(20250421)

一、SuperMap iDesktopX 问题1&#xff1a;iDesktopX怎么根据对数据集中的每条记录进行批量布局出图? 11.3.0 【解决办法】打开地图系列设置功能&#xff0c;勾选启用并设置索引地图&#xff0c;索引图层和索引字段等参数&#xff0c;打印地图册&#xff0c;设置输出路径&am…...

Linux学习笔记2

1.man man指令相当于一个在线手册 使用q可以退出指令运行 例如&#xff0c;使用 man ls 指令可以得到以下运行结果&#xff1a; 在查找的时候还可以使用数字&#xff0c;使用 man man 指令&#xff0c;对应每个数字所表示的内容&#xff1a; 在Linux下&#xff0c;一切皆是文件…...

电脑安装adb并且连接华为手机mate60pro后查看设备

1.下载adb工具 下载地址&#xff1a; https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn#downloads 根据需要下载自己系统需要的安装包 下载后解压 2.配置adb工具环境变量 添加ADB_HOME D:\softwares\platform-tools-latest-windows\platform-…...

EAL4+与等保2.0:解读中国网络安全双标准

EAL4与等保2.0&#xff1a;解读中国网络安全双标准 在当今数字化时代&#xff0c;网络安全已成为各个行业不可忽视的重要议题。特别是在金融、政府、医疗等领域&#xff0c;保护信息的安全性和隐私性显得尤为关键。在中国&#xff0c;EAL4和等级保护2.0&#xff08;简称“等保…...

树莓派学习专题<8>:使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率

树莓派学习专题&#xff1c;8&#xff1e;&#xff1a;使用V4L2驱动获取摄像头数据--获取摄像头支持的分辨率 1. 获取摄像头支持的分辨率2. 代码分析3. 树莓派实测 1. 获取摄像头支持的分辨率 使用如下代码获取摄像头支持的输出分辨率。 struct v4l2_frmsizeenum stFrameSize …...

CSS预处理器对比:Sass、Less与Stylus如何选择

引言 CSS预处理器已成为现代前端开发的标准工具&#xff0c;它们通过添加编程特性来增强纯CSS的功能&#xff0c;使样式表更加模块化、可维护且高效。在众多预处理器中&#xff0c;Sass、Less和Stylus是三个最流行的选择&#xff0c;它们各自拥有独特的语法和功能特点。本文将深…...

Vue3集成sass

安装依赖 pnpm add -D sass-embedded配置全局变量 新建文件 src/styles/variables.scss配置Vite 修改 vite.config.ts variables.scss $base-color: bluevite.config.ts // https://vite.dev/config/ export default defineConfig({plugins: [vue(),],resolve: {alias: {:…...

超越Dify工作流:如何通过修改QwenAgent的Function Call及ReAct方法实现对日期时间的高效意图识别

在构建复杂的AI应用时,意图识别是一个至关重要的环节。传统上,许多开发者会使用Dify工作流来完成这一任务,但在处理复杂意图时,这种方法往往需要大模型进行多级反复识别,从而带来较高的时间成本。 本文将介绍如何通过修改QwenAgent框架中的FnCallAgent和ReActChat类,实现…...

Lua 第8部分 补充知识

8.1 局部变量和代码块 Lua 语言中的变量在默认情况下是全局变量 &#xff0c;所有的局部变量在使用前必须声明 。 与全局变量不同&#xff0c;局部变量的生效范围仅限于声明它的代码块。一个代码块&#xff08; block &#xff09;是一个控制结构的主体&#xff0c;或是一个函…...

Lua 第7部分 输入输出

由于 Lua 语言强调可移植性和嵌入性 &#xff0c; 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中&#xff0c;从图形、数据库到网络的访问等大多数 I/O 操作&#xff0c;要么由宿主程序实现&#xff0c;要么通过不包括在发行版中的外部库实现。 单就…...

Java 中 == 和 equals() 的区别

1. 运算符 是 Java 中的比较运算符&#xff0c;用于比较两个变量的值是否相等&#xff0c;但具体行为取决于变量的类型&#xff1a; 类型 比较的内容基本类型直接比较值是否相等&#xff08;如 int a 5; int b 5; a b 返回 true&#xff09;引用类型比较内存地址&#x…...

Redis新节点加入集群会发生什么(面试题)

新加入主节点&#xff1a;会发生槽位数据重新分配迁移&#xff0c; 新加入从节点&#xff0c;会发生主从同步&#xff0c;全量同步和增量同步 当一个新节点加入 Redis 集群时&#xff0c;会触发一系列操作以确保集群的稳定性和数据的一致性。以下是新节点加入 Redis 集群时的详…...

dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明

dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明 1 环境介绍2 安装部署dmncdm2.1 196部署cdm环境2.2 197部署cdm环境2.3 190部署cdm环境 3 主备集群/主从集群配置4 部署主备集群/主从集群5 部署日志6 更多达梦数据库全方位指南:安装 优化 与实战教程 1 环境介绍 cpu x8…...

docker容器,mysql的日志文件怎么清理

访问问题 你的问题是因为在当前路径 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录。以下是详细分析和解决方法&#xff1a; 错误原因 路径不存在 当前目录 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录&#xff0c;执行 cd data/ 时会报错 No suc…...

kafka auto.offset.reset详解

在 Kafka 中&#xff0c;auto.offset.reset latest 的含义及行为如下&#xff1a; 1. ​​核心定义​​ 当消费者组​​首次启动​​或​​无法找到有效的 offset​​&#xff08;例如 offset 过期、被删除或从未提交&#xff09;时&#xff0c;消费者会从分区的​​最新位置…...

设备制造行业如何避免项目管理混乱?

项目常因进度延误、成本超支或部门协作不畅而陷入混乱&#xff1f; 这不仅拖累项目交付&#xff0c;还可能损害客户信任和企业利润。设备制造行业的项目管理复杂多变&#xff0c;从需求获取到生产交付再到售后运维&#xff0c;每一个环节都可能成为效率的瓶颈。 如何破解这一…...

kubernetes》》k8s》》删除命名空间

使用 kubectl delete ns 命名空间 --force --grace-period0 如果还删除不掉 需要 kubectl get namespace 命名空间 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空间/finalize” -f ./x.json...

【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)

新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...

55、Spring Boot 详细讲义(十一 项目实战)springboot应用的登录功能和权限认证

项目文档:springboot应用的登录功能和权限认证 一、项目概述 1. 项目简介 本项目是在一个基于Spring Boot的Web应用中实现登录功能和权限认证。要求实现登录功能,用户登录成功以后,会给前台返回当前登录用户可以访问的权限菜单,比如超级管理员可以访问所有权限,产品管理…...

react 父子组件通信 子 直接到父, 父 forwardref子

React核心概念&#xff1a;单向数据流&#xff08;Unidirectional Data Flow&#xff09; React 中数据的流动像瀑布一样&#xff0c;只能从上层组件&#xff08;父组件&#xff09;流向下层组件&#xff08;子组件&#xff09;。 子组件无法直接反向修改父组件的数据&#x…...

基于TCP的协议

目录 TCP 基于TCP的应用层协议&#xff1a; TCP的工作方式 TCP TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议。它为应用层提供了一个可靠的端到端的数据传输服务。再TCP/IP模型中&#xff0c;TCP位于传输层&#xff0c;负责再…...