哈希表(散列)
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
代码实现:
public class HashTabDemo {
public static void main(String[] args) {
HashTab ht = new HashTab(10);
ListNode ln = new ListNode(5,"zh");
ht.add(ln);
ht.list();
ListNode v = ht.findEleById(5);
System.out.println("找到的姓名" + v.name);
}
}
class HashTab {
private HashElementList[] hashlist;
private int size;
public HashTab(int size){
this.size = size;
hashlist = new HashElementList[size];
}
public void add(ListNode node){
int index = hashGet(node.id);//计算对应的数组下标
if(null == hashlist[index]){
hashlist[index] = new HashElementList();
}
hashlist[index].addElement(node);//添加数据
}
public void list(){
for(int i = 0;i<hashlist.length;i++){
if(null != hashlist[i]){
hashlist[i].list();
}
}
}
public ListNode findEleById(int id){
ListNode n = null;
int index = hashGet(id);//计算对应的数组下标
if(null != hashlist[index]){
n = hashlist[index].findEleById(id);//上对应的链表中查找数据
}
return n;
}
public int hashGet(int id){
return id%size;
}
}
class ListNode{
public int id;
public String name;
public ListNode next;
public ListNode(int id,String name){
this.id = id;
this.name = name;
}
}
class HashElementList{
public ListNode head;
public HashElementList(){
head = new ListNode(-1,"");
}
public void addElement(ListNode node){
if(head.next == null){
head.next = node;
}else{
ListNode temp = head.next;
while(null != temp.next){
temp = temp.next;
}
temp.next = node;
}
}
public void list(){
ListNode temp = head.next;
if(null == temp){
return;
}
while(temp != null){
System.out.print("id=" + temp.id + " name" + temp.name + "\t");
temp = temp.next;
}
}
public ListNode findEleById(int id){
ListNode temp = head.next;
if(null == temp){
return null;
}
while(temp != null){
if(temp.id == id)
{
return temp;
}
temp = temp.next;
}
return null;
}
}