HashMap是如何解决哈希冲突
哈希冲突HashMap是一种键值对的存储数据结构,通过哈希函数把key映射到数组下标(bucket),哈希冲突就是不同的key经过哈希函数后得到相同的数组下标,因为数组有限,而key无限,所以冲突是不可避免的 HashMap常见的解决哈希冲突的方法拉链法(Separate chaining/链地址法)每个数组下标不直接存储单个元素,而是存储一个链表或链式结构,当key冲突时,放到这个链表中。 查找时,根据key的哈希值找到数组的下标,遍历链表,比较key是否相等 优点 简单易实现 当冲突少时,效率很高 缺点 链表过长时查找效率下降(后续Java8+用红黑树替换链表提升性能) 地址开放法(Open Addressing)所有元素都存储在数组中,没有链表。当冲突发生时,寻找数组中下一个空槽位存放元素。常用探查方式:线性探查(下一个空槽依次查找)、二次探查(查找间隔平方递增,减少群聚现象)、双哈希(用第二个哈希函数计算步长) 优点 节约内存,不需要链表指针 缺点 数组负载因子过高时,插入/查找效率下降 再哈希法当哈希冲突严重时,通过扩...
最优化理论与方法
1 线性规划与整数规划1.1 最优化基本要素 将实际问题抽象地用数学模型来描述,包括选择优化变量,确定目标函数,给出约束条件 对数学模型进行必要的简化,并采用适当的最优化方法来求解数学模型 目标函数、优化变量、约束条件是最优化问题数学模型的三个基本要素 优化变量一个实际的优化方案可以用一组参数来表示。在这些参数中,有些根据要求在优化过程中始终保持不变,这类参数为常量。另一些参数的取值则需要在优化过程中调优和优选,一直处于变化的状态,这类变量称为优化变量。优化变量必须是独立的参数。 n维空间,n维欧氏空间 因为优化变量xi(i=1,2,⋅⋅⋅,n)x_i(i=1,2,···,n)xi(i=1,2,⋅⋅⋅,n)都是实数,所以这n个独立变量组成的n维向量空间是一个n维实空间,用RnR^nRn表示。 优化变量的个数(优化问题的维数)称为自由度,个数越多,自由度越高 目标函数目标函数是用优化变量来表示的优化目标的数学表达式,是方案好坏的评价标准,故又称为评价函数。目标函数通常表示为 f(x)=f(x1,x2,⋅⋅⋅,xn) f(x)=f(x_1,x_2,···,x_n) f(x)=f(...
数据库
数据库概念 数据库:一个长期存储、有组织的、可共享的数据集合 数据库管理系统:用于创建、读取、更新、删除和管理数据库的软件(如MySQL、PostgreSQL、MongoDB、Redis、ClickHouse等) 两层关系:应用<–>DBMS<–>存储(磁盘/SSD、缓存) 数据库分类与典型场景 关系型数据库:表、行、列、支持SQL、事务(ACID)。典型:MySQL、PostgreSQL、Oracle。适合OLTP(在线事务处理) Key-Value存储:超快速读写,常做缓存/会话(Redis、Memcached) 文档数据库:JSON/BSON文档,灵活schema(MongoDB)。适合半结构化数据。 列式/宽式数据库:面向大规模分析、列存储(Cassandra、HBase、ClickHouse)。适合OLAP/时序/日志分析 图数据库:关系密集型图查询(Neo4j、JanusGraph) 时序数据库:时间序列优化(InfluxDB、Prometheus TSDB) 搜索引擎:全文搜索与倒...
计算机网络基础
概念与分层模型网络的概念网络是现代软件系统的基础(分布式系统、微服务系统、云、流媒体、物联网都离不开它) 两个常见的模型 OSI七层模型:(物理、数据链路、网络、传输、会话、表示、应用),便于概念教学所以使用该分层 TCP/IP(四/五层)模型:(链路/网络接口、网络/Internet、传输/Host-to-Host、应用),更贴近实际协议栈,(IP/TCP/UDP/HTTP) 对照表:1.物理层->网线/光纤/无线2.数据链路层->Ethernet、MAC、ARP、交换机3.网络层->IP(IPv4/IPv6)、路由、ICMP4.传输层->TCP/UDP、端口、流控、拥塞控制5.应用层->DNS、HTTP、TLS、SMTP、FTP、SSH 物理层与链路层(从线缆到帧) 物理层:介质(双绞线、光纤、同轴)、信号编码、带宽、噪声、衰减、抖动(jitter) 链路层(数据帧): MAC地址(48bit,厂商前缀+唯一接口I...
数字图像处理
1.1图像及其分类基本概念 图:是物体反射或投射电磁波的分布 像:是人的视觉系统对接受的图信息在大脑中形成的印象 图像:是图和像的结合。具体来说,就是用各种观测系统以不同形式和手段观测客观世界而获得的、可以直接或间接作用于人的视觉系统而产生的视知觉实体 图像处理:是对图形信息进行加工以满足人的视觉或应用需求的行为。处理的方法通常有:模拟图像处理、数字图像处理、光电结合处理。 模拟图像处理:也称光学图像处理,它是利用光学透镜或光学照相(例如:胶片照相机)方法对模拟图像进行的处理,其实时性强、速度快、处理信息量大、分辨率高,但是处理精度差,难有判断功能 数字图像处理:利用计算机技术或其他数字技术,对图像信息进行某些数字运算和各种加工处理,以改善图像的视觉效果和提高图像实用性的技术 光电结合处理:用光学方法完成运算量巨大的处理(如频谱变换等),再用计算机对光学处理结果(如频谱)进行分析判读等处理。该方法是前两种的有机结合,它集结了两者的优点 图像处理的基本特征:系统的输入和输出都是图像。核心是在不改变图像核心内容结构的前提下,改善图像质量或提取基础特征 计算机中图像的表示...
一些关于Redis
Redis简单介绍Redis是基于内存的高性能key-value存储(支持多种数据结构:string、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream等) 内存读写极快,支持持久化(RDB/AOF)、单线程处理命令(命令执行是原子性的)、支持复制、哨兵高可用和Cluster分片 常用场景:缓存、会话、限流、计数器、排行榜、消息队列、分布式锁等 持久化:RDB(快照):低开销,可能丢数据点(适合备份);AOF(命令追加):更耐久但文件更大、更慢些(可配置fsync策略) 内存管理/驱逐策略: maxmemory用来限制内存;当满时按maxmemory-policy决定如何驱逐:noeviction、allkeys-lru、volatile-lru、volatile-ttl、allkeys-random等,选allkeys-lru常用于缓存场景 原子性/事务/脚本:单命令原子:MULTI/EXEC是事务队列(不保证隔离);Lua脚本在Redis内部执行,整体原子且性能好(常用于实现安全释放...
一些关于MySQL
MySQL基础概念MySQL是一个关系型数据库管理系统(RDBMS),它存储的数据是结构化的,使用表来存储信息,支持SQL(机构化查询语言)来操作数据 概念 说明 数据库 数据的集合 表 数据库中的具体存储机构 行 表中的一条记录 列 表的字段 主键 唯一标识一行记录 外键 关联另一张表的字段 索引 加速数据查询的工具 MySQL数据类型数值类型 类型 描述 INT 整数 BIGINT 大整数 DECIMAL 精确小数 FLOAT/DOUBLE 浮点数 字符串类型 类型 描述 CHAR(n) 固定长度 VARCHAR(n) 可变长度 TEXT 长文本 日期时间类型 类型 描述 DATE 日期(YYYY-MM-DD) DATETIME 日期时间 TIMESTAMP 时间戳,自动记录修改时间 基本SQL操作创建表1234567CREATE TABLE users( id INT PRIMARY KEY AUTO_INCREMENT, usernam...
Gin-Echo
它们是什么 Gin:轻量、性能导向、API风格接近Martini,但实现上更高性能(使用高效路由/最小分配等)。适合需要高吞吐与中等复杂度的服务。以最少的开销+开发效率取胜 Echo:语言简洁、功能齐全、可拓展性好,内置很多中间件(CORS、JWT、静态、日志等),上手快,适合快速构建REST服务。以完整性+可拓展性取胜 框架核心对比(要点) 路由:Gin使用高效的redix/tree路由实现(零分配/fast),Echo也有高性能路由实现。两者在典型场景差异很小。 中间件链:两者都采用链式中间件(Request->中间件1->中间件2->Handler->返回)。中间件顺序很重要(认证放在路由前面、错误恢复放最外层等) 绑定与验证:Gin原生支持binding标签并在Bind时触发验证(内部使用go-playground/validator);Echo通常配合go-playground/validator,通过实现echo.Validator把验证接入。推荐统一使用github.com/...
Dijkstra算法
它解决了什么问题在大多数最短路径问题中,Dijkstra算法是最常用的、效率最高的。它是一种“单源”最短路径的算法,一次计算能够得到从一个起点到其他所有点的最短距离长度、最短路径的途径点 输入为带权图G=(V,E),边权非负(有负权边考虑Bellman-Ford/SPFA/Johnson),给定起点,适用于有向图和无向图(无向图就加双向边) 核心思想(贪心+松弛)维护每个点的“目前已知最短距离”dist[],反复从未确定的点里选出dist最小者u(用最小堆加速),将它永久确定;然后用u去尝试”放松”所有出边(u,v,w):如果dist[v]>dist[u]+w,就更新之,并记录parent[v]=u以便还原路径 因为所有边权非负,当前dist最小的未确定点u再走任何边其代价只会增加,不可能通过未确定的其他点得到更短的代替路径,故一旦选出就最优(贪心选择性质) 实现细节(邻接表+最小堆) 数据结构:adj[u]存(v,w),priority_queue堆按(dist,node)升序 常量:INF取很大(如4e18),避免溢出 复杂度:用二叉堆:O...
Go的并发
Goroutine轻量级线程,goroutine是Go运行时(runtime)管理的协程,比操作系统线程更轻量 初始栈空间只有几kb,会按需自动增长 Go runtime提供M:N调度模型,N个Goroutine映射到M个操作系统线程 在函数调用前加go关键词启动 12345678910111213141516171819package mainimport ( "fmt" "time")func work(id int){ for i:=0;i<3;i++{ fmt.Printf("Worker %d: %d\n",id,i) time.Sleep(time.Millisecond*500) }}func main(){ go work(1) //开启一个Goroutine go work(2) //再开一个Goroutine time.Sleep(2*time.Second)//主协程等待...
