雜湊表碰撞的鏈結法解決之雙向鍊錶刪除操作的代價

2021-06-27 02:10:33 字數 724 閱讀 9034

最近在看《演算法導論》,在看到雜湊表的時候遇到了一些問題。在這篇博文中得到了解答。

原博文中的《演算法導論》可能是第二版,與我手中的第三版的頁數略微不同。在第三版中,這個疑問點在145頁(英文p257~258)

浣熊今天讀到《演算法導論》的第十一章雜湊表,看到中文書的第135頁(英文p224~225)時,被其中的乙個知識點難住,想了許久終於有了答案,故撰此文與大家分享

在雜湊表發生碰撞問題的時候,其中一種解決方法叫「鏈結法」,具體的做法我就不介紹了。在這一部分的最後,書作者提出如果採用雙向鍊錶的話,則刪除操作可以在o(1)時間內完成,這便是我疑問所在。其實我的不理解根源在於沒有理解書中所說的元素x與關鍵值key的定義,按照作者所說,元素x中存放的是指向某個物件的指標,即x指向某一塊記憶體區域;而key則是我們所關注的物件中的資料。有了這個概念後我的疑問就迎刃而解了:如果知道指向某個物件的指標,而且鍊錶是雙向的,那麼我們就很容易找到指向這個物件的前乙個物件和後乙個物件的指標,那麼刪除該物件只需對其前乙個物件和後乙個物件的指標域進行相應修改即可。但是如果是單鏈表,我們知道指向某個物件的指標,僅僅能夠獲得指向該物件之後的物件的指標,無法獲取指向它前乙個物件的指標,這樣就沒有辦法對該物件進行刪除(無法對前乙個物件的指標域賦值)。所以我們只有根據x的key值,找到對應的煉表頭,然後逐個查詢,直到找到x,記錄其前後物件指標,修改後即完成物件的刪除工作。這樣看來,如果是單鏈表情況下的刪除操作,給key值和給x值是等價的,即都需要從表頭遍歷鍊錶查詢資料,而不像雙鏈表那樣可以直接對物件進行刪除。

資料結構之鍊錶的高階 雙向鍊錶

上一章提到了鍊錶,表中各節點均只有乙個指標,且都統一指向直接後繼節點,通常這類鍊錶稱為單向鍊錶 或單鏈表 雖然單鏈錶能100 解決 一對一 資料的儲存問題,但是在解決某些特殊問題時,單鏈表並不是效率最優的儲存結構,例如在某個場景需要大量的查詢前驅節點,這種情況下使用單鏈表無疑是災難性的問題,因為單鏈...

鍊錶的C語言實現之迴圈鍊錶及雙向鍊錶

一 迴圈鍊錶 迴圈鍊錶是與單鏈表一樣,是一種鏈式的儲存結構,所不同的是,迴圈鍊錶的最後乙個結點的指標是指向該迴圈鍊錶的第乙個結點或者表頭結點,從而構成乙個環形的鏈。迴圈鍊錶的運算與單鏈表的運算基本一致。所不同的有以下幾點 1 在建立乙個迴圈鍊錶時,必須使其最後乙個結點的指標指向表頭結點,而不是象單鏈...

python 資料結構之雙向鍊錶的實現

和單鏈表類似,只不過是增加了乙個指向前面乙個元素的指標而已。示意圖 python 實現 usr bin python coding utf 8 class node object def init self,val,p 0 self.data val self.next p self.prev p ...