資料結構與演算法 一 雜湊表的應用

2021-10-09 16:56:44 字數 2249 閱讀 2739

linkedhashmap是在普通hashmap的基礎上新增了linked功能,那linked是什麼呢?

linked表示當我們將key-value對加入到map容器中時,會按照新增的先後順序進行排序。也就是說,當執行以下**時,

// 10表示初始大小,0,75表示裝載因子,true表示按照訪問時間順序

mapmap =

newlinkedhashmap

<

>(10

,0.75f

,true);

map.

put(2,

"bb");

map.

put(1,

"aa");

map.

put(3,

"cc");

for(map.entry entry : m.

entryset()

)

列印出來的順序就是2,1,3。

這是由於linkedhashmap底層不僅使用了雜湊表便於快速訪問元素,還使用了雙向鍊錶。將各個元素按照插入時間的先後順序組織成雙向鍊錶,這就使得linkedhashmap支援按照插入順序遍歷元素。

這裡,雜湊表部分是key-value對映,而雙向鍊錶部分,則對各元素按照插入時間的先後順序進行了排序。節點的pre和next域屬於雙向鍊錶,分別指向雙向鍊錶中節點的前驅和後繼。而hnext域則屬於雜湊表,用拉鍊法解決衝突。

下面再來改一下這段**。

// 10表示初始大小,0,75表示裝載因子,true表示按照訪問時間順序

mapmap =

newlinkedhashmap

<

>(10

,0.75f

,true);

map.

put(2,

"bb");

map.

put(1,

"aa");

map.

put(3,

"cc");

map.

put(1,

"dd");

map.

get(2)

;for

(map.entry entry : m.

entryset()

)

這樣,得到的結果是3,1,2。

原因是,linkedhashmap還支援按照訪問時間的順序進行遍歷,在map.put(1,「dd」)時,使得key為1的鍵值對被訪問,在map.get(2),使得key為2的鍵值對被訪問。所以,按照訪問的時間先後順序是3,1,2。

處理方法實際上用到了lru原則(最近最少使用原則),首先設定鍊錶頭部為最先訪問的節點,尾部為最新訪問的節點,頭尾各有指標指向。當查詢1個節點時,如果節點不在鍊錶中,則將其加入到鍊錶尾部;如果節點在鍊錶中,則將其移動到鍊錶的尾部。在構建linkedhashmap時指定按照訪問時間順序為true,就可以按照訪問順序遍歷了。

注意:這裡並不適合使用單鏈表。原因是,當我們使用雜湊表以o(1)複雜度查詢到目標節點時,如果使用了單鏈表,則必須再以o(n)複雜度獲取到該目標節點的前驅節點,才可以刪除該目標節點。而如果使用雙鏈表,可以直接以o(1)複雜度刪除。

在有序集合中,每個成員物件有兩個重要屬性,key(鍵值)和score(分值),一般會通過key來查詢資料,也會用score值來查資料。比如,支付寶的每個使用者都有1個使用者id(即key)、姓名,每個使用者還有自己的支付寶積分(即score)。

對使用者物件的操作包括:

①新增乙個使用者;

②按id刪除乙個使用者;

③按id查詢乙個使用者;

④按照積分進行範圍查詢,比如查詢分值在[100,200]的所有使用者;

⑤按照積分對使用者進行排序。

那麼該如何高效地實現這些方法呢?

借用 linkedhashmap 的實現原則,使用雜湊表+雙向鍊錶的方式。

首先,前三個操作可以看做是使用到了key,那麼就可以按照鍵值構建雜湊表,這樣時間複雜度為o(1)。

然後,對於按照積分score對成員物件進行範圍查詢、排序等操作,可以按score值從小到大的順序將物件組織成雙向鍊錶。

然而,用雙向鍊錶查詢乙個物件的時間複雜度為o(n),可以更高效一點嗎?

由於該雙鏈表是有序的,那麼就可以借助有序陣列的「二分法」思想,對鍊錶進行二分查詢,也就是所謂的跳表。

在使用跳表後,範圍查詢的時間複雜度為o(logn)。

資料結構與演算法 雜湊表

對映在數學上相當於乙個函式f x a b。雜湊表的核心是乙個雜湊函式 hash function 這個函式規定了集合a中的元素如何對應到集合b中的元素。根據設定的雜湊函式 h key 和處理衝突的方法 將一組關鍵字映像到乙個有限的連續的位址集 區間 上,並以關鍵字在位址集中的 像 作為相應記錄在表中...

資料結構與演算法 雜湊表

雜湊表也叫雜湊表,hash表是一種根據關鍵字值 key value 而直接進行訪問的資料結構。是把記錄的儲存位置和記錄的關鍵字之間建立對應關係的一種儲存結構。雜湊表又叫 雜湊表,速度很快,最常用的一種儲存機構是順序表 鍊錶的結構 主結構是順序表,每個順序表中的元素又對應一張鍊錶。雜湊表的常用資料結構...

資料結構與演算法 雜湊表

雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。如下圖,定義了16個陣列,每個陣列用來存放一條鍊錶.在插入資料時,首先...