首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

數據結構第8章動態存儲管理習題全解析 (嚴蔚敏版)

     編輯:關於C語言

數據結構第8章動態存儲管理習題全解析 (嚴蔚敏版)

本文整理《數據結構題集》(嚴蔚敏、吳偉民版) 第 8 章「動態存儲管理」全套習題解析,涵蓋基礎知識題 1-10、算法設計題 11-16,包含邊界標識法、伙伴系統、廣義表引用計數、存儲緊縮等核心考點。

章節資源索引

  • 源碼說明:《數據結構-C語言版》課本源碼+習題集解析使用說明
  • 課本源碼合輯:《數據結構》課本源碼合輯
  • 習題集全解析:《數據結構題集》習題解析合輯
  • 測試數據包:數據包

文檔目錄:數據結構\▼配套習題解析\▼08 動態存儲管理

一、基礎知識題 (8.1 - 8.10)

8.1 邊界標識法首次適配:空閒塊回收與合併

初始狀態

(1) 回收地址 559、大小 45 的塊:檢查前後相鄰塊 tag,合併相鄰空閒塊,更新鏈表指針。

(2) 分配 100 → 回收地址 515、大小 44:首次適配分割塊,再回收合併。注意頭尾部大小域包含自身空間。

答案圖解

8.2 循環鏈表首次適配轉最佳適配條件

8.2

答案:附加「按空閒塊大小遞增排序」條件。首次適配在有序表中即為最佳適配。

8.3 兩空閒塊(100, 200)申請序列對比

8.3

(1) 最佳適配能滿足、首次適配不能:申請 100, 100, 100。最佳適配用 200 塊分兩次 100,首次適配用 100 塊後剩 200 只能再分一個 100。

(2) 首次適配能滿足、最佳適配不能:申請 60, 60, 80, 100。首次適配在 100 取 60 剩 40,200 取 60 剩 140→80→60;最佳適配在 100 取 60 剩 40,200 取 80 剩 120→60→60 失敗。

8.4 邊界標識法 vs 可利用空間表節點結構效率

8.4 節點結構

答案:邊界標識法利用塊首尾標識,回收時 O(1) 檢查相鄰塊 tag 並合併;圖示結構需遍歷鏈表尋找相鄰塊,O(n)。

8.5 首次適配 vs 最佳適配:數據結構/分配/回收差異

8.5

(1) 數據結構:最佳適配需按大小排序(或維護多鏈表),首次適配僅需地址序。

(2) 分配:首次適配首滿足即用;最佳適配需遍歷尋找最小滿足塊。

(3) 回收:邏輯相同(合併相鄰空閒),最佳適配額外需維護大小序。

8.6 伙伴系統:塊地址與大小計算伙伴地址

8.6

大小 4 (2²):地址 011011110000 ⊕ 100 = 011011110100 (第 2 位翻轉)

大小 16 (2⁴):地址 ⊕ 10000 = 011011010000 (第 4 位翻轉)

8.7 伙伴系統 512 字內存分配釋放完整演示

8.7

初始:512 塊 → 分配 23→32、45→64、52→64、100→128、11→16、19→32 → 釋放 45,52,11 → 合併伙伴 → 更新鏈表。

8.8 伙伴系統最小失敗申請序列

8.8

可用空間 25,序列使 a1+...+an 最小且 an 失敗。答案涉及伙伴分裂與外部碎片分析。

8.9 廣義表引用計數存儲管理

8.9

(1) L=(L1,L3), L1=(L2,L3,L4), L2=(L3), L3=(), L4=(L2) → 繪製帶計數器結構,L3 計數 3,L2 計數 2 等。

(2) 刪除 L1:遞減 L1 及其子表計數,計數歸 0 者釋放。L3 計數 3→2 不釋放,L4 計數 1→0 釋放,L2 計數 2→1 不釋放。

(3) L2=(L3,L4):出現循環引用 (L2→L4→L2),引用計數法無法回收循環結構,導致記憶體洩漏。

8.10 堆結構存儲緊縮:存儲器格局變換

8.10

給出緊縮前佔用/空閒塊分布表,要求列出緊縮後所有佔用塊前移、空閒塊合併的新格局表。

二、算法設計題 (8.11 - 8.16)

8.11-8.12 棧式釋放規則 (LIFO) 動態存儲管理

8.11

數據結構:單棧指標 + 分配記錄棧。分配:指標前移,記錄大小入棧。釋放:棧頂必為最新分配,指標回退,出棧。

8.13 邊界標識法首次適配回收算法

8.13

檢查前塊 tag(尾部標識)、後塊 tag(首部標識),四種合併情況,更新鏈表前驅後繼指針。

8.14 伙伴系統存儲回收算法

8.14

計算伙伴地址 (地址 ⊕ 大小),檢查伙伴是否空閒且同大小,是則合併雙倍大小,遞歸向上合併;否則插入對應大小鏈表。

8.15 無用單元搜集:標記-掃描構建空閒表

掃描 [lowbound, highbound] 區間,tag=0 的塊按地址遞增鏈接成空閒表,塊大小 cellsize。

8.16 存儲緊縮算法完整實現

8.16

掃描堆,將佔用塊向低地址緊湊移動 (memmove),更新地址映射表,尾部形成大空閒塊。

核心知識圖譜

方法核心數據結構分配策略回收合併優點缺點
邊界標識法雙向鏈表 + 首尾標識首次/最佳/最差適配O(1) 檢查相鄰合併快、外部碎片少內部碎片、管理開銷
伙伴系統按大小分類的空閒鏈表陣列向上取整至 2^k伙伴地址 XOR 合併無外部碎片、合併快內部碎片大、大小受限
存儲緊縮堆指標 + 塊描述表指標遞增批量移動合併空間利用率高移動開銷大、需重定位
引用計數表頭計數域創建時增刪除時減,歸0釋放即時回收、簡單循環引用洩漏、開銷

轉載請註明出處

原文鏈接:[來源地址]

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved