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结构。