真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中的HashTable哈希表是什么?

一:概念
順序結(jié)構(gòu)以及平衡樹中,元素關(guān)鍵碼與其存儲位置之間沒有對應(yīng)的關(guān)系,因此在查找一個元素時,必須要經(jīng)過關(guān)鍵碼的多次比較。順序查找時間復(fù)雜度為O(N),平衡樹中為樹的高度,即O(log_2 N),搜索的效率取決于搜索過程中元素的比較次數(shù)。
理想的搜索方法:可以不經(jīng)過任何比較,一次直接從表中得到要搜索的元素。 如果構(gòu)造一種存儲結(jié)構(gòu),通過某種函數(shù)使元素的存儲位置與它的關(guān)鍵碼之間能夠建立一一映射的關(guān)系,那么在查找時通過該函數(shù)可以很快找到該元素。
當(dāng)向該結(jié)構(gòu)中:
插入元素
根據(jù)待插入元素的關(guān)鍵碼,以此函數(shù)計算出該元素的存儲位置并按此位置進(jìn)行存放。
搜索元素
對元素的關(guān)鍵碼進(jìn)行同樣的計算,把求得的函數(shù)值當(dāng)做元素的存儲位置,在結(jié)構(gòu)中按此位置取元素比較,若關(guān)鍵碼相等,則搜索成功。
該方式即為哈希(散列)方法,哈希方法中使用的轉(zhuǎn)換函數(shù)稱為哈希(散列)函數(shù),構(gòu)造出來的結(jié)構(gòu)稱為哈希表(HashTable)(或者稱散列表)
二: 沖突-概念
對于兩個數(shù)據(jù)元素的關(guān)鍵字K1!=K2,但有:Hash(K1) == Hash(K2),即:不同關(guān)鍵碼通過相同哈希函數(shù)計算出相同的哈希地址,該種現(xiàn)象稱為哈希沖突或哈希碰撞。
把具有不同關(guān)鍵碼而具有相同哈希地址的數(shù)據(jù)元素稱為“同義詞”。
三:沖突-避免-設(shè)計哈希函數(shù)
引起哈希沖突的一個原因可能是:哈希函數(shù)設(shè)計不夠合理。 哈希函數(shù)設(shè)計原則:
1.哈希函數(shù)的定義域必須包括需要存儲的全部關(guān)鍵碼,而如果散列表允許有m個地址時,其值域必須在0到m-1之間。
2.哈希函數(shù)計算出來的地址能均勻分布在整個空間中。
3.哈希函數(shù)應(yīng)該比較簡單。
常見哈希函數(shù)有:

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都做網(wǎng)站、壺關(guān)網(wǎng)絡(luò)推廣、成都微信小程序、壺關(guān)網(wǎng)絡(luò)營銷、壺關(guān)企業(yè)策劃、壺關(guān)品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供壺關(guān)建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

  1. 直接定制法--(常用)
    取關(guān)鍵字的某個線性函數(shù)為散列地址:Hash(Key)= A*Key + B
    優(yōu)點:簡單、均勻
    缺點:需要事先知道關(guān)鍵字的分布情況
    使用場景:適合查找比較小且連續(xù)的情況

  2. 除留余數(shù)法--(常用)
    設(shè)散列表中允許的地址數(shù)為m,取一個不大于m,但最接近或者等于m的質(zhì)數(shù)p作為除數(shù),按照哈希函數(shù):Hash(key) = key% p(p<=m),將關(guān)鍵碼轉(zhuǎn)換成哈希地址。
  3. 平方取中法--(了解) 折疊法--(了解)隨機(jī)數(shù)法--(了解)數(shù)學(xué)分析法--(了解)。
    四:沖突-避免-設(shè)計哈希函數(shù)Java中的HashTable哈希表是什么?

五: 沖突-解決
解決哈希沖突兩種常見的方法是:閉散列(線性探測法)和開散列(拉鏈桶)
六:(1)沖突-解決-閉散列
閉散列:也叫開放定址法,當(dāng)發(fā)生哈希沖突時,如果哈希表未被裝滿,說明在哈希表中必然還有空位置,那么可以把key存放到?jīng)_突位置中的“下一個” 空位置中去。那如何尋找下一個空位置呢?
線性探測:從發(fā)生沖突的位置開始,依次向后探測,直到尋找到下一個空位置為止。
插入:
通過哈希函數(shù)獲取待插入元素在哈希表中的位置,如果該位置中沒有元素則直接插入新元素,如果該位置中有元素發(fā)生哈希沖突,使用線性探測找到下一個空位置,插入新元素。
采用閉散列處理哈希沖突時,不能隨便物理刪除哈希表中已有的元素,若直接刪除元素會影響其他元素的搜索。比如刪除元素4,如果直接刪除掉,44查找起來可能會受影響。因此線性探測采用標(biāo)記的偽刪除法來刪除一個元素。
但是:閉散列最大的缺陷就是空間利用率比較低,這也是哈希的缺陷。

六:(2)沖突-解決-開散列/哈希桶(重點)
開散列法又叫鏈地址法(開鏈法),首先對關(guān)鍵碼集合用散列函數(shù)計算散列地址,具有相同地址的關(guān)鍵碼歸于同一子集合,每一個子集合稱為一個桶,各個桶中的元素通過一個單鏈表鏈接起來,各鏈表的頭結(jié)點存儲在哈希表中。
Java中的HashTable哈希表是什么?

從上圖可以看出,開散列中每個桶中放的都是發(fā)生哈希沖突的元素。
開散列,可以認(rèn)為是把一個在大集合中的搜索問題轉(zhuǎn)化為在小集合中做搜索了。

七:性能分析
雖然哈希表一直在和沖突做斗爭,但在實際使用過程中,我們認(rèn)為哈希表的沖突率是不高的,沖突個數(shù)是可控的,也就是每個桶中的鏈表的長度是一個常數(shù),所以,通常意義下,我們認(rèn)為哈希表的插入/刪除/查找時間復(fù)雜度是O(1) 。
八:和 java 類集的關(guān)系

  1. HashMap 和 HashSet 即 java 中利用哈希表實現(xiàn)的 Map 和 Set
  2. java 中使用的是哈希桶方式解決沖突的
  3. java 會在沖突鏈表長度大于一定閾值后,將鏈表轉(zhuǎn)變?yōu)樗阉鳂洌t黑樹)
  4. java 中計算哈希值實際上是調(diào)用的類的 hashCode 方法,進(jìn)行 key 的相等性比較是調(diào)用 key 的 equals 方法。所以如果要用自定義類作為 HashMap 的 key 或者 HashSet 的值,必須覆寫 hashCode 和 equals 方 法,而且要做到 equals 相等的對象,hashCode 一定是一致的。


網(wǎng)站題目:Java中的HashTable哈希表是什么?
網(wǎng)址分享:http://weahome.cn/article/jsdjpp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部