一、題目
說明在雜湊表內部,如何通過將所有未占用的槽連線成乙個自由鍊錶,來分配和儲存元素所佔的儲存空間。假定乙個槽可以儲存乙個標誌、乙個元素、乙個或兩個指標。所有的字典和自由鍊錶操作均應具有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,由於...