1. 程式人生 > >數據結構-哈希

數據結構-哈希

自變量 sel 很多 之間 __init__ 兩個 開放定址法 關鍵字 lis

首先講講什麽是直接尋址

直接尋址表的定義
假設有一個數據集合U={d1,d2,d3,...,dn}U={d1,d2,d3,...,dn},該數據集合裏面的每一個元素didi都有一個對應的鍵值keyikeyi和數據dataidatai。集合中的任意一個keyikeyi都是在[0,m][0,m]之間的整數。新建一個數組A[0..m]A[0..m],遍歷一遍集合UU,將其中的數據didi放到A[keyi]A[keyi]中。

技術分享圖片

如果存的是兩個樹1和10000 那麽就要開辟一段內存從1到10000,這樣對空間是很大浪費,所以就有來哈希表

哈希表:

.哈希表(Hash Table , 又稱散列表 )是線性表對存儲結構,由直接尋址表和一個哈希函數組成,哈希函數h(k)將元素k作為自變量

返回元素存儲下標

舉個栗子:


class HashTable:
def __init__(self,size=101):
self.size = size
self.T = [LinkList() for i in range(self.size)]

def h(self,k):
return k % self.size

def insert(self,k):
i = self.h(k)
if self.find(k):
print(‘duplicated insert‘)
else:
self.T[i].append(k)


def find(self,k):
i = self.h(k)
return self.T[i].find(k)

就以上栗子,哈希函數h(k)取余 會有問題,會有重復,那麽這就是哈希沖突

處理沖突的方法

(1)開放定址法(2)拉鏈法 (3)建立公共溢出區法
拉鏈法解決沖突的做法是:將所有關鍵字為同義詞的結點鏈接在同一個單鏈表中。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數組t[0..m-1]。凡是散列地址為i的結點,均插入到以t為頭指針的單鏈表中。t中各分量的初值均應為空指針。在拉鏈法中,裝填因子α可以大於1,但一般均取α≤1。

技術分享圖片

處理哈希沖突對方法還有很多種,這裏不一一說明

數據結構-哈希