抽象資料型別 「對映」 ADT Map

2021-10-05 15:04:32 字數 2509 閱讀 2222

字典,通過儲存key-data鍵值對的資料型別。

adt map的結構是鍵值關聯的無序集合。其中關鍵碼key具有唯一性,通過關鍵碼可以唯一確定乙個資料值。

通過雜湊表構造map。

class

hashtable

:def

__init__

(self)

: self.size=

11#可以任意設定,但為了便於求解,應該設為素數

self.slots=

[none

]*self.size

self.data=

[none

]*self.size

#定義雜湊函式

defhashfunction

(self,key)

:return key%self.size

#定義衝突解決方法,簡單線性加一

defrehash

(self,oldhash)

:return

(oldhash+1)

%self.size

defput(self,key,data)

: hashvalue=self.hashfunction(key)

#key不存在

if self.slots[hashvalue]

==none

: self.slots[hashvalue]

= key

self.data[hashvalue]

= data

#key已存在

else

:#未發生衝突

if self.slots[hashvalue]

== key:

self.data[hashvalue]

== data

else

:#發生雜湊衝突

nextslot=self.rehash(hashvalue)

while self.slots[nextslot]

!=none

and self.slots[nextslot]

!=key:

nextslot=self.rehash(nextslot)

if self.slots[nextslot]

==none

: self.slots[nextslot]

=key

self.data[nextslot]

=data

else

: self.data[nextslot]

=data

defget(self,key)

: startslot=self.hashfunction(key)

pos=startslot

#空槽時則表示找不到key

while self.slots[pos]

!=none

:if self.slots[pos]

==key:

#找到key

return self.data[pos]

else

: pos=self.rehash(pos)

#沒找到key,找下乙個

if pos==startslot:

#回到起點表示沒找到key

return

none

return

none

#通過設定__getitem__和__setitem__就可以實現形如h[key]的取值和賦值

def__getitem__

(self,key)

:return self.get(key)

def__setitem__

(self,key,data)

: self.put(key,data)

if __name__==

'__main__'

: h=hashtable(

)

h[1]

='cat'

h[5]

='piajun'

print

(h[1])

print

(h[5])

print

(h[2

])

輸出

cat

piajun

none

雜湊在最好的情況下(無衝突),可以提供o(1)時間複雜度的查詢效能。

評估雜湊衝突的最重要資訊為負載因子λ,負載因子表示雜湊表的空間使用程度,一般來說:λ越小,雜湊衝突概率越小,資料項通常能夠儲存在自己所屬的雜湊槽中;λ越大,衝突概率會越大,需要通過更多的比較來找到空槽;如果採用資料鏈,則意味著每條資料鏈上的資料項增多。

如果採用線性探測(依次往後找空槽)的開放定址法來解決衝突,則λ在0~1之間,

如果採用資料鏈來解決衝突(λ可大於1),

抽象資料型別對映 ADT Map

python 最有用的資料型別之一 字典 字典是一種可以儲存key value鍵值對的資料型別,其中關鍵碼key可用於查詢關聯的資料值data,這種鍵值關聯的方法稱為 對映map adt map的結構時鍵 值關聯的無序集合 關鍵碼具有唯一性 通過關鍵碼可以唯一確定乙個資料值 adt map定義的操作...

抽象資料型別

本篇文章簡單的講解下表 棧 佇列。首先先了解一下什麼是抽象資料型別。它是這麼定義的 抽象資料型別 abstract data type,即adt 是帶有一組操作的一些物件的集合。那麼adt怎麼理解呢?首先你只需要記住表 集合 圖以及與他們各自的操作一起形成的物件都可以被看做抽象資料型別.這就跟整型 ...

抽象資料型別 表

資料結構與演算法分析.c 實現 總結 抽象資料型別 abstract data type,首先顧名思義,她是一種資料型別,就像整數 字元,類似於加減乘除,他有自己的操作,例如 並和查詢 並沒有什麼法則規定一定要有什麼操作,具體的看設計要求 每種資料型別的實現方式也是不同的,主要有 陣列實現和鍊錶實現...