hash算法——数据结构与算法学习
Hash算法
hash算法背景
因为在有序表中查找,经常使用二分查找,这样效率就依赖与数据的规模,如果数据的规模过大,算法的效率就会变得很低,那么,有没有一种方法,直接通过关键字key一次得到所要的结果呢,这也就是hash表的由来。(hash表通过映射极大地提高了查询效率)——典型的用空间换时间
散列技术
散列技术是指在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使每一个关键字都对应一个存储位置。即:存储位置=f(关键字)。这样,在查找的过程中,只需要通过这个对应关系f 找到给定值key的映射f(key)。只要集合中存在关键字和key相等的记录,则必在存储位置f(key)处。我们把这种对应关系f 称为散列函数或哈希函数。
hash表的应用背景
hash算法的应用
google面试题
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的 id 时,要求查找到该员工的 所有信息.
public class EmpLinkedList {
private Emp head;
//添加方法
public void add(Emp emp){
if(head == null){
head = emp;
return;
}
Emp cur = head;
while (true){
if(cur.next == null){
break;
}
cur = cur.next;
}
cur.next = emp;
}
//遍历方法
//遍历链表的雇员信息
public void list(int no) {
if(head == null) { //说明链表为空
System.out.println("第 "+(no+1)+" 链表为空");
return;
}
System.out.print("第 "+(no+1)+" 链表的信息为");
Emp curEmp = head; //辅助指针
while(true) {
System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name);
if(curEmp.next == null) {//说明 curEmp 已经是最后结点
break;
}
curEmp = curEmp.next; //后移,遍历
}
System.out.println();
}
//查找
public Emp findEmpById(int id){
if(head == null){
System.out.println("链表为空");
return null;
}
Emp cur = head;
while(true){
if(cur.id == id){
break;
}
if(cur.next == null){
cur = null;
break;
}
cur = cur.next;
}
return cur;
}
}
核心思想:就是用一个数组,然后用hash算法生成索引,在对应索引位置添加链表,即为hashmap结构。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现