在開放定址算法里,線性探測法是散列解決沖突的一種方法,當hash一個關鍵字時,發現沒有沖突,就保存關鍵字, 如果出現沖突,則就探測沖突地址下一個地址,依次按照線性查找,直到發現有空地址為止,從而解決沖突,
例如 關鍵字集合{7、8、30、11、18、9、14},散列函數為:H(key) = (keyx3) MOD 7, 設裝填因子(元素個數/散列表長度)為0.7,那么 散列表的長度為 10。
關鍵字(key)集合存放位置分別為:
7 | 8 | 30 | 11 | 18 | 9 | 14 |
0 | 3 | 6 | 5 | 5 | 6 | 0 |
由表格知道,這里的7和14、30和9、11和18出現了位置存放沖突。存放key=7時,散列表長度為10的表中其實沒有沖突, 因為7是第一個存在到表中的key,所以一定不會有沖突的,所以7對應散列表的地址0。8、30、11存放的地址分別是3、 6 、5,但是到了key=18時候,發現存放的地址為5,而地址5已經存放了key=11,這時發生了地址沖突。根據線性探測法,算法會探測地址5的下一個地址,即地址6,而此時地址6已經存放了key=30,程序繼續探測下一個地址,發現地址7位空,此時把key=18存放到地址7處。以此類推,最后得出的散列表為:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7 | 14 | 8 | 11 | 30 | 18 | 9 |
成功查找率:(1+1+1++1+3+3+2)/ 7
不成功查找率
計算查找不成功的次數就直接找關鍵字到第一個地址上關鍵字為空的距離即可, 但根據哈希函數地址為MOD7,因此初始只可能在0~6的位置。等概率情況下,查找0~6位置查找失敗的查找次數為:
地址0,到第一個關鍵字為空的地址2的距離為3,因此查找不成功的次數為3.
地址1, 到第一個關鍵為空的地址2的距離為2,因此查找不成功的次數為2.
地址2, 到第一個關鍵為空的地址2的距離為1,因此查找不成功的次數為1.
地址3,到第一個關鍵為空的地址4的距離為2,因此查找不成功的次數為2.
地址4,到第一個關鍵為空的地址4的距離為1,因此查找不成功的次數為1.
地址5,到第一個關鍵為空的地址2(注意不是地址9,因為初始只可能在0~6之間,因此循環回去)的距離為5,因此查找不成功的次數為5.
地址6,到第一個關鍵為空的地址2(注意不是地址9,因為初始只可能在0~6之間,因此循環回去)的距離為4,因此查找不成功的次數為4.
不成功查找率:(3+2+1+2+1+5+4)/7