一:對以往所學的簡單資料結構回顧
學習程式語言時陣列是我們首先接觸到的資料結構。眾所周知,陣列在訪問資料時通過下標可以及其快速的訪問資料,但是在刪除和插入時陣列就表現的並不優越。
鍊錶在資料的刪除和插入時會很方便,但是不能達到對資料的快速訪問。
那麼有沒有一種對兩者進行綜合的資料結構呢?
答案是肯定的。比如hash資料結構就可以即擁有陣列的優點又可以實現鍊錶的優點。
那麼我們就簡單的介紹一下什麼是hash,並實現乙個簡單的hash結構
二:hash的簡單介紹
hash:hash就是將任意長度的輸入通過雜湊演算法得到固定長度的輸出,該輸出即為雜湊值。
其中得到雜湊值的方法極為雜湊函式。雜湊函式可以得到儲存元素的儲存位置。
例如:向陣列中存入資料 200,如果直接將200作為陣列的元素值儲存(比如array[i]=200),則在查詢的時候需要遍歷陣列並判斷某一位置是否是200。
這樣的儲存方法在查詢在資料比較多的時候會比較浪費時間。
那麼我們可以通過某一函式,獲得該元素所在位置的索引,那麼在查詢的時候只需獲得該索引位置的資料即可。
比如:int index = h(存入的元素);
其中index 即為獲得的索引。而該函式即為雜湊函式。
常用的構造雜湊函式的方法如下:
1:直接定址法
2:數字分析法
3:平方取中法
4:摺疊法
5:隨機法
6:除留取餘法:取關鍵字被某個不大於雜湊表長度的數p除后所得的餘數為雜湊位址。例如關鍵字200,取p=30;餘數20即為關鍵字200的雜湊位址。
三:用除留取餘法實現乙個簡單的hash結構
聰明的你肯定會想到在做除留取余時可能會出現具有相同雜湊位址的情況。
為了處理這一問題我們就需要將陣列和鍊錶聯合使用了。
其中陣列儲存鍊錶,而鍊錶儲存元素。
依然用除留取餘法獲得元素的索引,若有相同的雜湊位址則將該資料新增到該位置處煉表中
那麼我們首先定義乙個節點類
package hashv3;
public class datanode定義乙個鍊錶並實現資料的新增和刪除
package hashv3;public class myhash
/*** 新增元素
* @param node
*/public void add(datanode node)else
}public boolean remove(datanode node)
datanode temp = array[index];
if(temp.member==node.member)
while(temp.next.member != node.member && temp.next!=null)
temp.next = temp.next.next;
return true; }
/*** 列印資料
*/public void print()
/*** 新增方法
*/private void add()
hash.print(); }
/*** 刪除方法
*/private void remove()
}
資料結構 hash
雜湊表 hash table,也叫雜湊表 是根據鍵 key 而直接訪問在記憶體儲存位置的資料結構。分為兩個步驟 hash函式 通過乙個關於鍵值的hash函式,得到所查詢的資料對映到表中乙個位置。訪問資料 不同的key 經過hash函式 可能計算得到相同的輸出。此時叫做衝突,衝突的資料又成乙個表。一般...
Hash表的資料結構
hashmap與hashset的結構是差不多的,以陣列作為桶,每個桶中裝的是鍊錶,當鍊表的元素超過8個時桶中的元素自動轉為紅黑樹儲存。hashmap與hashset的預設負載因子為0.75,當hash表中的元素超過陣列長度乘以負載因子的積時會擴容,通過呼叫resize 實現,一般是擴容一倍。使用乙個...
Redis的資料結構 Hash
1.雜湊鍵值結構 key field value特點 key value是一堆鍵值對 field value也是一對鍵值對 2.重要的api hget key field 獲取hash key對應的value hset key field value 設定hash key對應的field的value...