1. 程式人生 > >雜湊表-開放地址法之線性探測

雜湊表-開放地址法之線性探測

**雜湊表
優點:速度快(插入和查詢)
缺點:基於陣列,不能有序的遍歷
鍵值對儲存方式,通過鍵來訪問值
hashMap.put( key , value );

解決雜湊衝突有兩種方法:
開放地址法
鏈地址法

線性探測屬於開放地址法

線性探測插入演示:
陣列最初狀態

這裡寫圖片描述
在這組資料中要插入83
這裡寫圖片描述

這裡寫圖片描述
先對要插入資料雜湊化,雜湊化後的資料就是陣列下標,這裡雜湊化後的資料是23
這裡寫圖片描述
然後發現23已經有資料了,產生衝突,線性探測的解決方案是依次遞增,直到找到空位
這裡寫圖片描述
這裡寫圖片描述
**

package map;

/*
 * 2017年12月19日17:04:18
 *
 * 雜湊表
 *
 * 解決雜湊衝突的方法為開放地址法(線性探測)
 */
public class HashApp { public dataItem [] arr ;//雜湊表的底層是由陣列實現的 public int size ;//當前陣列的最大長度 public dataItem newItem ;//新插入的節點 public int currentSize ;//當前陣列有幾個元素 //初始化 public HashApp ( int maxSize ) { arr = new dataItem [maxSize] ; size = maxSize ; currentSize = 0 ; } //雜湊化
public int hash ( int value ) { //返回雜湊化後的索引下標 return value % size ; } //新增新資料 public void insert ( int data ) { //如果滿了,直接返回 if ( isFull () ) { System.out.println ( "hashmap is full" ); return ; } int index = hash ( data ) ;//計算雜湊化後的索引
newItem = new dataItem ( data ) ; //當前下標中元素不為空,說明有元素了,index遞增 while ( arr [index] != null ) { index ++ ; index = hash(index) ;//防止index超過陣列最大索引下標 } arr [index] = newItem ;//退出迴圈,說明找到空位了,放進去 ++ currentSize ; } //刪除資料 public void delete ( int data ) { int index = hash ( data ) ; while ( arr [index] != null ) { if ( arr [index].getValue () == data ) { arr [index] = null ; return ; } index ++ ; index = hash (index) ; } } //查詢資料 public dataItem find ( int value ) { int index = hash ( value ) ; while ( arr [index] != null ) { if ( arr [index].getValue () == value ) { return arr [index]; } index ++ ; index = hash (index) ; } return null ; } //判斷陣列是否滿 public boolean isFull () { return currentSize == size ; } //雜湊表無法有序的遍歷! //所以這裡遍歷只是檢視一個數據的分佈情況 public void display () { for ( int i = 0 ; i < arr.length ; ++i ) { if ( arr [ i] != null) System.out.print ( arr [i].getValue () +" "); } System.out.println ( ); } } --------------------------------------------- package map; public class dataItem { private int value ; public dataItem ( int value ) { this.value = value ; } public int getValue () { return value ; } public void setValue ( int value ) { this.value = value ; } }