数据结构java实现哈希表
概念
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。根据散列值作为地址存放数据,这种转换是一种压缩映射,简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。查找关键字数据(如K)的时候,若结构中存在和关键字相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。我们称这个对应关系f为散列函数(Hash function),按这个事件建立的表为散列表。
综上所述,根据散列函数f(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址
看定义真的好难理解试着看我抄的代码理解吧
先创建一个单链表 ,详细的看注释吧 每个点都解释了
package com.hashtable.s;
/*
* 创建单链表的节点
* */
public class Node {
//节点中的数据
public String number;
public String name;
public String address;
public Node next = null;
//哈希的key
public int key;
//构造器
public Node(String number, String name, String address ,int key) {
this.number = number;
this.name = name;
this.address = address;
this.key = key;
}
//初始化节点复制
public Node() {
this.number = null;
this.name = null;
this.address = null;
this.next = null;
}
}
package com.hashtable.s;
public class SingleList {
public Node head;
public SingleList(){
head=new Node();//创建头节点是必要的
}
public void addNode(String number, String name, String address,int key){
//将数据搞到节点上
Node newNode = new Node(number, name, address,key);
//创建一个指针
Node temp = head;
while (temp.next != null){
//遍历到末尾节点
temp = temp.next;
}
//将数据查到尾节点
temp.next = newNode;
//printList(key);
}
//打印链表 也就是遍历节点的数据呗
public void printList(int key){
Node p=head;
head.key = key;
//System.out.println(key);
while (p != null){
System.out.println(p.address+","+ p.name+","+p.number+","+"("+key+")"+"----->");
//System.out.println(p);
p=p.next;
}
}
//查询 这里只能根据号码查 还有待优化
public String[] search(String number) {
//创建一个字符串集合
String[] context = new String[3];
Node p = head.next;
//解释一下:在p不等于空时匹配电话号是否相等 当p为空时还没有匹配到就跳出循环查找失败
while (p!=null&&(!p.number.equals(number))){
p = p.next;
}
if (p==null){
for(int i=0;i<context.length;i++) {
context[i]="没有你要查找的号码";}
}else {
context[0] = p.number;
context[1] = p.name;
context[2] = p.address;
}
return context;
}
}
为了模仿jdk咱也搞个接口
package com.hashtable.s;
public interface SinList {
int get_key(String number);
void insert(String number, String name, String address);
void PrintHash();
String[] search(String number);
}
这里搞得哈希主要是数组与链表的结合,随便定义了一个散列值
package com.hashtable.s;
public class HashTable implements SinList{
//定义一个单链表数组
SingleList[] hashTa;
//哈希表长度先定义8个吧
int length = 8;
//初始化哈希表
public HashTable(){
hashTa = new SingleList[length];
//把这8个单链表遍历出来
for(int i = 0; i<length; i++){
hashTa[i] = new SingleList();
}
}
//或取哈希散列值(key)
public int get_key(String number){
int key = 0;
int length = number.length();
for (int i =0; i<length;i++){
key = key+length;
}
key =key % 7;
System.out.println("得到的key===="+key);
return key;
}
//先简单定义一个插入方法
public void insert(String number, String name, String address){
//或取key
int key = get_key(number);
//调用单链表插入节点数据
hashTa[key].addNode(number,name,address,key);
}
//打印链表
public void PrintHash() {//在控制台上打印哈希表
for(int i=0;i<length;i++) {
hashTa[i].printList(i);//也就是打印每一个单恋比奥啦
System.out.println();
}
}
//查询数据
public String[] search(String number){
String[] contest = new String[3];
int key = get_key(number);
//调用单链表中的search
contest = hashTa[key].search(number);
return contest;
}
}