从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)
在数据结构的世界里,红黑树一直以「自平衡二叉查找树」的身份备受赞誉。凭借红黑节点的精妙设计,它能将插入、删除、查找的时间复杂度稳定控制在 ( log n ) (\log n) (logn),成为处理有序数据的经典方案。然而,当业务场景对「快速查找」提出极致要求时,红黑树的局限性逐渐显现 ——我们是否需要一种更直接的数据访问方式? 哈希表正是为突破这一困境而生,它用独特的映射机制颠覆了传统树结构的查找逻辑
目录
- 1 红黑树的优势与潜在短板
- 2.哈希表:以空间换时间的终极方案
- 2.1 hash 函数
- 2.2 哈希冲突
- 2.3 哈希冲突解决
- 2.3.1 扩容
- 2.3.2 链表法
- 2.3.3开放寻址法
- 3 布隆过滤器(哈希升级)
- 3.1 背景
- 3.2 位图
- 3.3 布隆操作
- 3.4 应用分析
- 4 分布式一致性 hash
- 4.1 背景
- 4.2 hash 偏移
- 4.3虚拟节点
- 4.4 数据迁移
1 红黑树的优势与潜在短板
- 红黑树的核心优势:红黑树通过五条严格规则(如根黑、叶黑、红节点无子红、黑高平衡)维持树的平衡,确保最坏情况下的操作效率。在需要维护数据有序性的场景(如数据库索引、任务调度优先级队列)中,它能高效完成范围查询(例如:查找价格在 100-200 元之间的商品)。
- 红黑树的性能瓶颈:尽管 ( O ( log n ) (O(\log n) (O(logn) 的复杂度已足够优秀,但当业务聚焦于 「单键快速查找」 时,红黑树的比较式搜索显得冗余:
- 路径依赖:每次查找需从根节点沿比较路径逐层遍历,即便树高度可控,仍存在对数级的比较开销。
- 有序性代价:为维持树的平衡与有序,插入 / 删除时需频繁调整节点颜色与结构(旋转操作),额外消耗计算资源。
- 范围无关场景:若应用仅需「根据 ID 获取用户信息」这类单键操作,红黑树的有序性反而成了负担。
2.哈希表:以空间换时间的终极方案
哈希表借助哈希函数(如 MD5、FNV 哈希)将数据键值映射为数组索引,实现「键→值」的直接访问。例如,将用户 ID 通过哈希函数计算后,直接定位到对应数组槽位获取用户信息,理论上可将查找复杂度降至 ( O ( 1 ) ) (O(1)) (O(1))
2.1 hash 函数
定义:给定一个输入数据(可以是字符串、数字、文件内容等各种形式的数据),哈希函数会对其进行一系列的计算和转换,最终生成一个固定长度的输出值,这个输出值就是哈希值。例如,对于字符串 “hello”,经过某个哈希函数计算后,可能得到一个 32 位的十六进制数作为哈希值。
特性:
- 确定性:对于相同的输入数据,哈希函数必须始终返回相同的哈希值。也就是说,无论何时对同一个数据调用哈希函数,得到的结果都是一致的。例如,多次对字符串 “world” 使用同一个哈希函数计算,得到的哈希值应该完全相同。
- 强随机性 (高效性和均匀分布性):在处理海量文件的哈希计算时,快速的哈希函数可以显著提高处理速度。理想情况下,哈希函数应该能够将输入数据均匀地映射到哈希值的取值范围内。这样可以减少哈希冲突(不同的输入数据得到相同的哈希值的情况)的发生概率
- 单向性:哈希函数是一种单向函数,即从哈希值很难(甚至不可能)反向推导出原始的输入数据。这一特性在数据存储和安全领域非常重要,比如存储用户密码时,通常存储的是密码的哈希值,而不是原始密码,这样即使哈希值被获取,也无法轻易得到原始密码。
常用的哈希函数(非密码学 无需了解实现 只需选择就行)
- MurmurHash2:计算速度比较快,且质量较好,在众多非加密哈希算法中是使用较为广泛的一种。其内部循环使用了乘法和旋转操作。不过,即使使用随机化种子实施 MurmurHash2,也容易受到 Hash DoS 攻击,通过差分密码分析能生成导致哈希碰撞的输入。
- CityHash:计算速度非常快,在处理大规模数据时表现出色。能够产生高质量的哈希值,哈希冲突的概率较低。它针对不同的平台和数据类型进行了优化,具有较好的适应性
- SipHash:要解决相近字符串的强随机分布性问题,能够抵抗各种形式的哈希冲突攻击,尤其是对恶意构造的输入具有很强的抵抗力,安全性较高。计算过程相对复杂,不过在现代硬件上仍然具有较好的性能
2.2 哈希冲突
定义:
哈希函数的作用是把任意长度的输入数据转化为固定长度的哈希值。哈希冲突指的是当两个或多个不同的输入数据,经过同一个哈希函数计算后,得到了相同的哈希值。可以用数学公式来表示:若有输入数据 x 1 x_1 x1 和 x 2 x_2 x2,且 x 1 ≠ x 2 x_1 \neq x_2 x1=x2,但经过哈希函数 H 计算后, ( H ( x 1 ) = H ( x 2 ) ) (H(x_1) = H(x_2)) (H(x1)=H(x2)),这种情况就属于哈希冲突。
负载因子:数组存储元素的个数 / 数据长度;用来形容散列表的存储密度;负载因子越小,冲突越小,负载因子越大,冲突越大;
2.3 哈希冲突解决
2.3.1 扩容
负载因子达到阈值:负载因子是指哈希表中已存储元素的数量与哈希表大小的比值。当负载因子超过预先设定的阈值(通常为 0.75 或 0.8)时,说明哈希表中元素已经比较密集,哈希冲突的概率增加,此时需要进行扩容。例如,一个哈希表初始大小为 16,当存储的元素达到 12 个时(负载因子达到 0.75),就可能触发扩容操作。
扩容操作
- 创建新的哈希表:按照一定的扩容策略,比如将哈希表的大小扩大为原来的两倍,创建一个新的更大的哈希表。这个新哈希表具有更多的槽位,能够容纳更多的元素,从而降低哈希冲突的概率。
- 重新计算哈希值并复制数据:遍历原哈希表中的每个元素,使用相同的哈希函数重新计算每个元素在新哈希表中的哈希值,并将其插入到新哈希表的相应位置。由于哈希表大小发生了变化,元素的哈希值在新哈希表中的分布也会不同,所以需要重新计算和分配位置。
和string以及vector扩容 差不多
2.3.2 链表法
引用链表来处理哈希冲突;也就是将冲突元素用链表链接起来;这也是常用的处理冲突的⽅式;但是可能出现一种极端情况,冲突元素比较多,该冲突链表过长,这个时候可以将这个链表转换为红黑树;由原来链表时间复杂度 转换为红黑树时间复杂度 ;
普通:
STL中hashmap
将链表连起来,方便实现迭代器
2.3.3开放寻址法
定义:当向哈希表中插入一个元素时,通过哈希函数计算出该元素的哈希值,若该位置已被占用(即发生哈希冲突),则按照一定的探测策略在哈希表中寻找下一个空闲的位置来插入该元素。查找元素时,也按照同样的探测策略在哈希表中进行搜索,直到找到目标元素或确定元素不存在。
操作:
- 线性探测:当发生哈希冲突时,从冲突位置开始,依次向后探测下一个位置,直到找到空闲位置为止
- 二次探测:探测的步长是探测次数的平方。即第一次探测的步长为 1²,第二次为 2²,第三次为 3²,以此类推。例如,发生冲突后,第一次探测的位置是冲突位置 + 1²,第二次是冲突位置 + 2²,第三次是冲突位置 + 3²,若超出哈希表范围,则对哈希表大小取模。
哈希聚集(这上面都会造成哈希聚集):当多个元素的哈希值相近时,它们会在哈希表中连续占据相邻的位置。->增加探测次数和降低插入效率
双重哈希::使用两个哈希函数,第一个哈希函数用于计算初始哈希值,当发生冲突时,使用第二个哈希函数计算一个步长,然后按照这个步长进行探测。(可以解决)
- 步长随机性:第二个哈希函数 h 2 ( k e y ) h_2(key) h2(key) 计算出的步长是基于元素的键值生成的,不同元素的步长可能不同。这使得在发生冲突时,元素不会像线性探测那样总是依次向后或按照固定模式探测,而是以不同的步长跳跃式地寻找空闲位置,从而避免了元素在某个区域过度聚集。
- 均匀分布:通过合理设计两个哈希函数,可以使元素在哈希表中更均匀地分布。
3 布隆过滤器(哈希升级)
3.1 背景
在计算机科学和信息技术领域,特别是在处理大规模数据集合时,经常需要快速判断一个元素是否属于某个集合。例如,在网络爬虫中,需要判断一个 URL 是否已经被访问过;在数据库系统中,要快速确定一个记录是否存在。传统的数据结构如哈希表,虽然可以实现快速查询,但在处理大规模数据时,需要消耗大量的内存空间来存储元素及其相关信息,空间成本较高。
总结:
- 布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在;
- 布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删除操作;
3.2 位图
位图(Bit - map),又称为位向量(Bit - vector)或比特数组(Bit - array),是一种用二进制位来表示和存储数据的数据结构
原理:位图中的每个二进制位(bit)都可以表示一个特定元素的某种状态,通常用 0 表示该元素不存在或不具有某种属性,用 1 表示该元素存在或具有某种属性。例如,要表示一个包含 10 个元素的集合,就可以创建一个长度为 10 的位图,初始时所有位都设置为 0。当集合中添加元素 3 时,就将位图的第 3 位设置为 1;如果要删除元素 3,就将第 3 位重新设置为 0。
图中展示了在 C++ 中利用 byte buf[8] 构建 64bit 位图的原理
你可以读一下这个链接->内存知识
3.3 布隆操作
- 插入过程:当插入 str1 时,h1(str1)、h2(str1)、h3(str1) 三个哈希函数分别计算出不同的哈希值,这些哈希值对应到位图中的位置,将这些位置的值从 0 置为 1(图中蓝色箭头指向的位置 ) 。插入 str2 时同理,h1(str2)、h2(str2)、h3(str2) 计算的位置(图中红色箭头指向 )也被置为 1 。
- 查询过程:当查询某个元素是否在集合中时,用相同的哈希函数计算该元素对应的位图位置。若这些位置的值都为 1 ,则该元素可能在集合中;只要有一个位置为 0 ,则该元素一定不在集合中。不过由于不同元素哈希值可能重叠(像图中部分箭头指向同一位置 ) ,存在误判情况,即元素实际不在集合中,但位图对应位置都为 1 。
哈希函数特性与位图存储:布隆过滤器使用多个哈希函数将元素映射到位图的不同位置。位图大小固定,当插入元素增多,不同元素经哈希函数计算后,映射位置可能重叠。比如有元素 A 和 B,A 先插入,其通过哈希函数计算的位图位置被标记为 1 ;之后插入 B,若 B 的部分哈希位置与 A 重叠,这些位置早已被标记为 1 。
3.4 应用分析
n – 预期布隆过滤器中元素的个数,如上图 只有str1和str2 两个元素 那么 n=2
p – 假阳率,在0-1之间 0.0000001也可以 这个错判率
m – 位图所占空间
k – hash函数的个数
n = ceil(m / (-k / log(1 - exp(log§ / k))))
p = pow(1 - exp(-k / (m / n)), k)
m = ceil((n * log§) / log(1 / pow(2, log(2))));
k = round((m / n) * log(2));
网站操作
可以快速算出m k
4 分布式一致性 hash
4.1 背景
- 哈希环构建:将整个哈希值空间组织成一个虚拟的圆环,比如哈希函数取值范围为 0 - 2^32 - 1 ,这就构成了哈希环。节点(如服务器)和数据都通过哈希函数映射到这个环上。例如,以服务器的 IP 地址或主机名作为关键字进行哈希,确定其在环上的位置 ;对数据的键进行哈希,也能定位到环上位置。
- 数据映射:当需要定位数据时,使用哈希函数对数据的键进行哈希,然后在哈希环上沿顺时针方向找到第一个遇到的节点,该数据就由这个节点负责处理。
4.2 hash 偏移
hash 算法得到的结果是随机的,不能保证服务器节点均匀分布在哈希环上;分布不均匀造成请求访问不均匀,服务器承受的压力不均匀
4.3虚拟节点
为了解决哈希偏移的问题,增加了虚拟节点的概念;理论上,哈希环上节点数越多,数据分布越均衡。
假设一个分布式存储系统中有三个物理节点,其 IP 地址分别为:
Node A:192.168.1.100
Node B:192.168.1.101
Node C:192.168.1.102
为每个物理节点创建多个虚拟节点,例如为每个节点创建三个虚拟节点,通过对 IP 地址和虚拟节点编号进行组合来标识虚拟节点,如下所示:
对于 Node A:
- 虚拟节点 A - 1:192.168.1.100 - 1
- 虚拟节点 A - 2:192.168.1.100 - 2
- 虚拟节点 A - 3:192.168.1.100 - 3
对于 Node B:
- 虚拟节点 B - 1:192.168.1.101 - 1
- 虚拟节点 B - 2:192.168.1.101 - 2
- 虚拟节点 B - 3:192.168.1.101 - 3
对于 Node C:
- 虚拟节点 C - 1:192.168.1.102 - 1
- 虚拟节点 C - 2:192.168.1.102 - 2
- 虚拟节点 C - 3:192.168.1.102 - 3
使用哈希函数对这些虚拟节点的标识(如上述组合的字符串)进行计算,将它们映射到哈希环上。例如,哈希函数可以是一个简单的取模运算,将虚拟节点的标识转换为一个在 0 到 2^32 - 1 之间的哈希值,从而确定其在哈希环上的位置。
4.4 数据迁移
增加节点
- 节点哈希计算与定位:对新增节点的标识(如 IP 地址等)进行哈希计算,确定其在哈希环上的位置。
- 数据迁移:从新增节点在哈希环上的位置开始,沿顺时针方向找到其前一个节点。将该前一个节点中,哈希值落在新增节点与该前一个节点之间的数据,迁移到新增节点上。
节点 A 的哈希值是 0。节点 B 的哈希值是 100。新节点 C 的哈希值是 50。新增节点 C(50)后,需要将 节点 B(100) 中哈希值落在 (50, 100] 范围内的数据迁移到 C(50)。
节点 A 的负责范围不变(仍负责回绕部分 (100, 0]),节点 B 的负责范围缩小为 (50, 100],节点 C 负责 (0, 50]。
数据迁移的核心是:仅迁移新增节点与它顺时针下一个节点之间的区间数据,其他节点的负责范围不受影响,从而最小化迁移量。
- 虚拟节点处理:若系统采用了虚拟节点,为新增物理节点创建对应的虚拟节点,并将虚拟节点映射到哈希环上。虚拟节点的数据迁移方式与上述物理节点类似,即把相关虚拟节点顺时针方向前一虚拟节点到它之间的数据进行迁移。不过,由于虚拟节点数量较多,数据迁移会更分散,能使数据分布更均匀,减少对单个节点的影响。
删除节点
- 节点移除:将待删除节点从哈希环上移除。
- 数据迁移:把被删除节点上的数据,全部迁移到其在哈希环上顺时针方向的下一个节点上。例如,节点 B 被删除,那么节点 B 上的数据会被迁移到节点 B 顺时针方向的下一个节点(假设是节点 C)上。
- 虚拟节点处理:对于要删除的物理节点所对应的虚拟节点,先将这些虚拟节点从哈希环上删除。由于虚拟节点对应的数据可能分散在多个物理节点上,所以每个虚拟节点的数据会根据其在哈希环上的位置,迁移到各自顺时针方向的下一个虚拟节点对应的物理节点上。这样可以避免单个物理节点因数据迁移量过大而出现负载过高的情况,提高系统的稳定性。
相关文章:
从红黑树到哈希表:原理对比与典型场景应用解析(分布式以及布隆过滤器)
在数据结构的世界里,红黑树一直以「自平衡二叉查找树」的身份备受赞誉。凭借红黑节点的精妙设计,它能将插入、删除、查找的时间复杂度稳定控制在 ( log n ) (\log n) (logn),成为处理有序数据的经典方案。然而,当业务场景对「…...
动手学深度学习:手语视频在VGG模型中的测试
前言 其他所有部分同上一篇AlexNet一样,所以就不再赘诉,直接看VGG搭建部分。 模型 VGG是第一个采取块进行模块化搭建的模型。 def vgg_block(num_convs,in_channels,out_channels):layers[]for _ in range(num_convs):layers.append(nn.Conv2d(in_ch…...
微信小程序实战案例 - 餐馆点餐系统 阶段 4 - 订单列表 状态
✅ 阶段 4 – 订单列表 & 状态 目标 展示用户「我的订单」列表支持状态筛选(全部 / 待处理 / 已完成)支持分页加载和实时刷新使用原生组件编写 ✅ 1. 页面结构:文件结构 pages/orders/├─ index.json├─ index.wxml├─ index.js└─…...
深度学习理论-直观理解 Attention
本文首先介绍 Attention 的原始公式,然后以 Self-Attention 为例,简化后逐步分析 Attention 计算结果表达的含义 Attention Attention 公式如下: A t t e n t i o n s o f t m a x ( Q ⋅ K T d k ) ⋅ V Attention softmax(\frac{Q \cd…...
python中 “with” 关键字的取舍问题
自动管理资源(自动关闭文件) 当你使用 with 打开文件时,文件会在 with 代码块结束后自动关闭,无论是否发生异常。这意味着你不需要显式地调用 f.close() 来关闭文件 示例: with open("words.txt", "r…...
ISIS协议(动态路由协议)
ISIS基础 基本概念 IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是ISO (International Organization for Standardization,国际标准化组织)为它的CLNP(ConnectionL…...
llm开发框架新秀
原文链接:https://i68.ltd/notes/posts/20250404-llm-framework3/ google开源ADK-Agent Development Kit 开源的、代码优先的 Python 工具包,用于构建、评估和部署具有灵活性和控制力的复杂智能体项目仓库:https://github.com/google/adk-python 2.6k项目文档:Age…...
Zookeeper的典型应用场景?
大家好,我是锋哥。今天分享关于【Zookeeper的典型应用场景?】面试题。希望对大家有帮助; Zookeeper的典型应用场景? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务,主要用于管理和协调大…...
【C数据结构】 TAILQ双向有尾链表的详解
TAILQ双向有尾链表的详解 常见的链表结构1.SLIST2.STAILQ3.LIST4.TAILQ5.CIRCLEQ 一、TAILQ链表简介二、TAILQ的定义和声明三、TAILQ队列的函数1.链表头的初始化2.获取第一个节点地址3.获取最后一个节点地址4.链表是否为空5.下一个节点地址6.上一个节点地址7.插入头节点8.插入尾…...
redisson的unlock方法
//分布式方式,分布式锁,采用redisson锁 RLock lock redissonClient.getLock(userId.toString());//lock方法会无限重试。getLock底层是hash,大key是userid,小key是线程,value是重入次数 try {//boolean b lock.tryLo…...
ffmpeg 切割视频失败 ffmpeg 命令参数 -vbsf 在新版本中已经被弃用,需要使用 -bsf:v 替代
ffmpeg 切割视频失败 ffmpeg 命令参数 -vbsf 在新版本中已经被弃用,需要使用 -bsf:v 替代 从日志中可以看到问题出在第一个 ffmpeg 命令执行时: Unrecognized option vbsf.Error splitting the argument list: Option not found这是因为 ffmpeg 命令参…...
设计模式——抽象工厂模式总结
理解了前面的工厂模式后,再理解抽象工厂模式就很容易了。 工厂模式:https://blog.csdn.net/inside802/article/details/147170118?spm1011.2415.3001.10575&sharefrommp_manage_link 抽象工厂模式就是工厂模式的更加抽象化,父类不仅不承…...
JavaScript 定时器
在 JavaScript 中,定时器是实现代码在特定时间间隔执行或延迟执行的重要工具。下面我们将深入探讨定时器的相关知识。 定时器基础 setTimeout() setTimeout() 函数用于在指定的延迟时间后执行一次回调函数。它接受两个参数,第一个参数是要执行的回调函…...
企业经营决策风险
在企业的经营过程中,领导者每天都在面对大量的决策——该扩大生产还是收缩业务?该增设销售渠道还是提升产品质量?但你知道吗,企业最大的成本,不是生产成本,也不是人工成本,而是决策错误的成本&a…...
【云安全】云原生-centos7搭建/安装/部署k8s1.23.6单节点
一、节点基本配置 1、准备操作系统 2、 修改主机名 hostnamectl set-hostname master-1 hostnamectl set-hostname node1 hostnamectl set-hostname node2#验证hostnamectl status 3、修改/etc/hosts cat <<EOF >>/etc/hosts 192.168.255.137 master-1 192.168…...
【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测
基于穿戴装备的身体活动监测 摘要 本研究基于加速度计采集的活动数据,旨在分析和统计100名志愿者在不同身体活动类别下的时长分布。通过对加速度数据的处理,活动被划分为睡眠、静态活动、低强度、中等强度和高强度五类,进而计算每个志愿者在…...
力扣每日打卡 1922. 统计好数字的数目 (中等)
力扣 1922. 统计好数字的数目 中等 前言一、题目内容二、解题方法1. 暴力解法(会超时,此法不通)2. 快速幂运算3. 组合计数的思维逻辑分析组合计数的推导例子分析思维小结论 4.官方题解4.1 方法一:快速幂 三、快速幂运算快速幂运算…...
宝塔Linux面板 - 添加站点建站时没有域名实现 IP 地址访问测试(宝塔面板建站 IP 访问)
前言 使用面板添加站点时,必须要填写一个域名用来指向程序,没有域名怎么办? 答案:域名直接写 【服务器 IP 地址】 操作步骤 如果还没有添加站点,则直接在创建站点的时候,域名那填写服务器地址即可&#…...
【GitHub探索】mcp-go,MCP协议的Golang-SDK
近期大模型Agent应用开发方面,MCP的概念比较流行,基于MCP的ToolServer能力开发也逐渐成为主流趋势。由于笔者工作原因,主力是Go语言,为了调研大模型应用开发,也接触到了mcp-go这套MCP的SDK实现。 对于企业内部而言&am…...
手撕TCP内网穿透及配置树莓派
注意: 本文内容于 2025-04-13 15:09:48 创建,可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容,请访问原文地址:手撕TCP内网穿透及配置树莓派。感谢您的关注与支持! 之前入手了树莓派5,…...
人形机器人运动与操作: 控制、规划和学习方面的当前进展与挑战
前言 图 1:执行运动和操作任务的人形机器人:(a)HRP-4 在适应地形的同时擦拭木板[1];(b-g)Digit、Hector[2]、Atlas、H1、Justin[3]和 Apollo 取放物体;(h)iCu…...
C++ 重构muduo网络库
本项目参考的陈硕老师的思想 1. 基础概念 进程里有 Reactor、Acceptor、Handler 这三个对象 Reactor 对象的作用是监听和分发事件;Acceptor 对象的作用是获取连接;Handler 对象的作用是处理业务; 先说说 阻塞I/O,非阻塞I/O&…...
【计算机网络实践】(十二)大学校园网综合项目设计
本系列包含: (一)以太网帧分析与网际互联协议报文结构分析 (二)地址解析协议分析与传输控制协议特性分析 (三)交换机的基本操作、配置、 虚拟局域网配置和应用 (四)交…...
通过api程序的方式编辑ps的三种方式
目前只使用了第一种 ps-python-api去操作 还没有尝试其他两种方式对于第一种方式必须要开启ps程序,程序调用修改新增图层和文档时会同步到ps页面,可以直观看到修改结果...
论文阅读笔记——Reactive Diffusion Policy
RDP 论文 通过 AR 提供实时触觉/力反馈;慢速扩散策略,用于预测低频潜在空间中的高层动作分块;快速非对称分词器实现闭环反馈控制。 ACT、 π 0 \pi_0 π0 采取了动作分块,在动作分块执行期间处于开环状态,无法及时响…...
MySQL表的增删改查进阶版
Mysql 1、数据库的约束1.1约束类型1.2 NULL约束1.3 UNIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束(重点)1.6 FOREIGN KEY:外键约束(重点) 2.表的设计2.1一对一2.2…...
【C#】Socket通信的使用
在C#中,Socket通信是一种用于实现网络通信的底层技术。通过Socket,程序可以在网络上与其他设备进行数据交换。以下是如何使用C#中的System.Net.Sockets命名空间来实现Socket通信的详细步骤。 1. Socket通信的基本概念 Socket: 一个Socket是网络通信的端…...
linux以C方式和内核交互监听键盘[香橙派搞机日记]
最近在深入研究我的香橙派,不可避免的遇到了怎么认识和使用Linux内核的问题。 我给自己留了一个简单的任务:使用原生C来监听内核,实现读取键盘的消息。 CSDN上也有其他文章来解决这个问题,不过要么是技术不达标(直接和…...
【C++初学】课后作业汇总复习(七) 指针-深浅copy
1、 HugeInt类:构造、、cout Description: 32位整数的计算机可以表示整数的范围近似为-20亿到+20亿。在这个范围内操作一般不会出现问题,但是有的应用程序可能需要使用超出上述范围的整数。C可以满足这个需求,创建功能强大的新的…...
【iOS】UIPageViewController学习
UIPageViewController学习 前言创建一个UIPageViewController最简单的使用 UIPageViewController的方法说明:效果展示 UIPageViewController的协议方法 前言 笔者最近在写项目时想实现一个翻书效果,上网学习到了UIPageViewController今天写本篇博客总结…...
GDB 调试命令详解:高效掌握常用调试技巧
🐞 GDB 调试命令详解:高效掌握常用调试技巧 GNU Debugger(GDB)是 Linux 下最强大的 C/C 调试工具。本文将系统梳理 GDB 的常用命令,覆盖运行控制、断点管理、变量查看、线程与进程调试等核心功能,助你快速掌…...
实验二 用递归下降法分析表达式实验
【实验目的】 1.掌握用递归下降分析法进行语法分析的方法。加深对自顶向下语法分析原理的理解。 2.掌握设计、编制并调试自顶向下语法分析程序的思想和方法。 3.本实验是高级语言程序设计、数据结构和编译原理中词法分析、自顶向下语法分析原理等知 识的综合。由于语法分析…...
【随身wifi】青龙面板保姆级教程
0.操作前必看 本教程基于Debian系统,从Docker环境。面板安装,到最后拉取脚本的使用。 可以拉库跑狗东京豆,elm红包等等,也可以跑写自己写的脚本,自行探索 重要的号别搞,容易黑号,黑号自己负责…...
从一到无穷大 #45:InfluxDB MCP Server 构建:从工程实践到价值重构
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 工程实践遇到的问题MCP Host选择开发流程 结果展现可能性展望工作生活带来的变化 MCP…...
app逆向专题五:新快报app数据采集
app逆向专题五:新快报app数据采集 一、抓包寻找数据接口二、编写代码三、完整代码一、抓包寻找数据接口 打开charles,并在手机端打开新快报app,点击“广州”或者“经济”等选项卡,抓包,寻找数据接口,如图所示: 二、编写代码 这里介绍一种简便的代码编写方法,在数据…...
使用 lm-eval 评估模型时报错:TypeError: ‘NoneType’ object is not callable 的解决方案
问题描述 在使用 lm-evaluation-harness 进行多 GPU 模型评估时,使用如下命令: accelerate launch --multi-gpu --num_processes 2 \-m lm_eval --model hf \--model_args pretrained${local_model_path} \--tasks mmlu \--batch_size 8 \--log_sample…...
脉冲耦合神经网络(PCNN):图像处理中的强大工具
文章目录 一、PCNN 的起源与背景二、PCNN 的基本原理(一)模型结构(二)工作方式(三)动态阈值与脉冲特征三、PCNN 在图像处理中的应用(一)图像分割(二)边缘检测(三)纹理分析四、PCNN 的实现与优化环境准备PCNN 类定义图像分割示例在图像处理和计算机视觉领域,神经网…...
【Git】从零开始使用git --- git 的基本使用
哪怕是野火焚烧,哪怕是冰霜覆盖, 依然是志向不改,依然是信念不衰。 --- 《悟空传》--- 从零开始使用git 了解 Gitgit创建本地仓库初步理解git结构版本回退 了解 Git 开发场景中,文档可能会经历若干版本的迭代。假如我们不进行…...
React Hooks 的使用
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
【NIO番外篇】之组件 Channel
目录 一、什么是NIO Channel?二、常见的Channel组件及其用法1. FileChannel2. SocketChannel3. ServerSocketChannel4. DatagramChannel 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下&a…...
探秘 Ruby 与 JavaScript:动态语言的多面风采
1 语法特性对比:简洁与灵活 1.1 Ruby 的语法优雅 Ruby 的语法设计旨在让代码读起来像自然语言一样流畅。它拥有简洁而富有表现力的语法结构,例如代码块、符号等。 以下是一个使用 Ruby 进行数组操作的简单示例: # 定义一个数组 numbers [1…...
高频面试题(含笔试高频算法整理)基本总结回顾21
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
深入浅出一下Python函数的核心概念与进阶应用
本篇技术博文摘要 🌟 本文系统梳理了Python函数的核心知识点,从基础概念到高级特性,构建了完整的函数编程知识体系。内容涵盖:变量作用域的局部与全局划分、函数注释的规范写法、参数传递中值与引用的区别、匿名函数的灵活应用&am…...
【漫话机器学习系列】198.异常值(Outlier)
异常值(Outlier)全面指南 —— 检测、分析与处理 作者:Chris Albon(图源) 场景:数据清洗与特征工程必备技能 一、什么是异常值(Outlier) 定义 异常值(Outlier࿰…...
React 记账本项目实战:多页面路由、Context 全局
在本文中,我们将分享一个使用 React 开发的「记账本」项目的实战经验。该项目通过 VS Code 完成,包含首页、添加记录页、编辑页等多个功能页面,采用了 React Router 实现路由导航,使用 Context API 管理全局的交易记录状态,并引入数据可视化组件呈现不同月份的支出情况。项…...
[React] 如何用 Zustand 构建一个响应式 Enum Store?附 RTKQ 实战与 TS 架构落地
[React] 如何用 Zustand 构建一个响应式 Enum Store?附 RTKQ 实战与 TS 架构落地 本文所有案例与数据为作者自行构建,所有内容均为技术抽象示例,不涉及任何实际商业项目 自从之前尝试了一下 zustand 之后,就发现 zustand 是一个轻…...
DeepSeek在职场办公中的高效指令运用与策略优化
摘要 随着人工智能技术的飞速发展,大型语言模型在各个领域的应用日益广泛。DeepSeek作为一款具有影响力的AI产品,为职场办公带来了新的变革与机遇。本文深入剖析DeepSeek在职场办公场景下的提示词指令运用,通过对提示词概念、作用、设计原则的…...
mysql事务脏读 不可重复读 幻读 事务隔离级别关系
看了很多文档,发现针对事务并发执行过程中的数据一致性问题,即脏读、不可重复读、幻读的解释一塌糊涂,这也不能说什么,因为官方SQL标准中的定义也模糊不清。 按照mysql中遵循的事务隔离级别,可以梳理一下其中的关系 隔…...
Fork/Join框架与线程池对比分析
Fork/Join框架与线程池对比分析 1. 概述 线程池(如ThreadPoolExecutor)是Java并发编程中用于管理线程生命周期的通用工具,适用于处理大量独立任务。Fork/Join框架(基于ForkJoinPool)是Java 7引入的专用框架ÿ…...
docker 安装 Gitlab
GitLab 安装 #创建容器数据卷映射目录 mkdir -p /usr/docker/gitlab/config mkdir -p /usr/docker/gitlab/logs mkdir -p /usr/docker/gitlab/data #目录授权 chmod 777 -R /usr/docker/gitlab/*#直接复制可用(记得改下宿主机ipv4,不知道怎么看,输入i…...