數據結構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;
}
}