演算法導論11 2 4未占用槽分配儲存

2021-07-01 22:41:32 字數 1515 閱讀 4846

一、題目

說明在雜湊表內部,如何通過將所有未占用的槽連線成乙個自由鍊錶,來分配和儲存元素所佔的儲存空間。假定乙個槽可以儲存乙個標誌、乙個元素、乙個或兩個指標。所有的字典和自由鍊錶操作均應具有o(1)的期望執行時間。該自由鍊錶需要是雙向鍊錶嗎?或者單鏈表就足夠了?

每個槽slot有乙個布林值flag屬性,表明是否已占用;

未占用slot:乙個雙向鍊錶把空閒slot都連線起來,每個free slot有兩個指標;

已占用slot:包含乙個元素element和兩個指標(參***是使用乙個指標,這裡為了方便)(可能nil),分別指向上乙個和下乙個雜湊到這個slot的元素,也就是是指向另乙個slot。(因為所有element都儲存在slot中)

乙個slot定義如下:

struct node()

插入操作:

1、如果元素x雜湊到乙個空slot,將這個空slot從free list移除,把x放到這個slot裡,next指標指向nil,然後維護freelist指標;

2、如果元素x雜湊到乙個非空slot槽位j,該slot已儲存元素y,分兩種情況:

a、hash(y)=j:freelist分配乙個新slot儲存x,將其插入y與y.next元素之間,即新slot指向y.next,y的指標指向新slot;

b、hash(y)≠j:freelist分配新slot,用於儲存y(包括元素、指標),指向舊slot的指標指向新slot,騰出的slot j存放x;

查詢操作:

查詢元素x,首先查詢槽hash(x),如果不是,沿著鍊錶指標一次查詢。

刪除操作:分三種情況,假設hash(x)=j,x雜湊到j

1、j.next=nil,即只有乙個元素x雜湊到slot j,只需將j釋放到自由表;

2、j.key=x,且j.next!=nil,x位於j槽,後面還有其他元素,把j.next移動到j,原j.next所佔空間釋放到自由表

3、j.key!=x且j.next!=nil,x位於j的next指標指向的後面的slot中,修改x前後元素指標,釋放x所佔slot.

//偽**

//分配新slot

removefromfreeslot(s)

//釋放slot到freelist

freeslottofreelist(s)

insertion(x)

search(x)

delete(x)

else if(r==j && j.next!=nil)

else 

r.prev.next=r.next;

if(r.next!=nil)

r.next.prev=r.prev;

freeslottofreelist(r);

}

演算法導論第十一章習題11 2 4

linknode.h includeusing namespace std class link class linknode linknode int num key num next null int getkey link.h include linknode.h class head cla...

《演算法導論》 2 3 1分治法

分治法 有很多演算法在結構上是遞迴的 為了解決乙個給定的問題,演算法要一次或多次地遞迴地呼叫其自身來解決相關的問題。這些演算法通常採用分治策略 將原問題劃分為n個規模較小而結構與原問題相似的子總是 遞迴地解決這些子問題,然後再合併其結果,就得到原問題的解。分治模式在每一層遞迴上都有三個步驟 分解 d...

演算法導論 查詢 二分查詢

二分查詢演算法是在有序陣列中用到的較為頻繁的一種演算法,在未接觸二分查詢演算法時,最通用的一種做法是,對陣列進行遍歷,跟每個元素進行比較,其時間為o n 但二分查詢演算法則更優,因為其查詢時間為o lgn 譬如陣列,查詢元素6,用二分查詢的演算法執行的話,其順序為 1.第一步查詢中間元素,即5,由於...