不是hash沖突的解決方式的是哪一種?
不是hash的解決方法的是:分支限界法
哈希的解決方法有:開放定址法;再哈希法;鏈地址法
hash索引和b索引區別?
Hash索引與B樹索引的區別
由于Hash索引結構和B樹不同,因此在索引使用上也會有差別:
(1)Hash索引不能進行范圍查詢,而B樹可以。
這是因為Hash索引指向的數據是無序的,而B樹的葉子節點是個有序的鏈表。
(2)Hash索引不支持聯合索引的最左側原則(即聯合索引的部分索引無法使用),而B樹可以。
對于聯合索引來說,Hash索引在計算Hash值的時候是將索引鍵合并后再一起計算Hash值,所以不會針對每個索引單獨計算Hash值。因此如果用到聯合索引的一個或多個索引時,聯合索引無法被利用。
(3)Hash索引不支持OrderBY排序,而B樹支持。
因為Hash索引指向的數據是無序的,因此無法起到排序優化的作用,而B樹索引數據是有序的,可以起到對該字段OrderBy排序優化的作用。
(4)Hash索引無法進行模糊查詢。而B樹使用LIKE進行模糊查詢的時候,LIKE后面前模糊查詢(比如%開頭)的話可以起到優化的作用。
(5)Hash索引在等值查詢上比B樹效率更高。
不過也存在一種情況,就是索引列的重復值如果很多,效率就會降低。這是因為遇到Hash時,需要遍歷桶中的行指針來進行比較,找到查詢的關鍵字非常耗時。所以Hash索引通常不會用到重復值多的列上,比如列為性別,年齡等。
ash算法?
常見hash算法的原理
散列表,它是基于快速存取的角度設計的,也是一種典型的“空間換時間”的做法。顧名思義,該數據結構可以理解為一個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。
散列表(Hashtable,也叫哈希表),是根據關鍵碼值(Keyvalue)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
比如我們存儲70個元素,但我們可能為這70個元素申請了100個元素的空間。70/1000.7,這個數字稱為負載因子。我們之所以這樣做,也是為了“快速存取”的目的。我們基于一種結果盡可能隨機平均分布的固定函數H為每個元素安排存儲位置,這樣就可以避免遍歷性質的線性搜索,以達到快速存取。但是由于此隨機性,也必然導致一個問題就是。所謂,即兩個元素通過散列函數H得到的地址相同,那么這兩個元素稱為“同義詞”。這類似于70個人去一個有100個椅子的飯店吃飯。散列函數的計算結果是一個存儲單位地址,每個存儲單位稱為“桶”。設一個散列表有m個桶,則散列函數的值域應為[0,m-1]。
解決是一個復雜問題。
主要取決于:
(1)散列函數,一個好的散列函數的值應盡可能平均分布。
(2)處理方法。
(3)負載因子的大小。太大不一定就好,而且浪費空間嚴重,負載因子和散列函數是聯動的。
解決的辦法:
(1)線性探查法:后,線性向前試探,找到最近的一個空位置。缺點是會出現堆積現象。存取時,可能不是同義詞的詞也位于探查序列,影響效率。
(2)雙散列函數法:在位置d后,再次使用另一個散列函數產生一個與散列表桶容量m互質的數c,依次試探(dn*c)%m,使探查序列跳躍式分布。