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

FZU 1893 內存管理:最佳適配算法模擬(鏈表/向量實現)

     編輯:關於C++

問題描述

模擬動態內存管理,初始 100 單位空閒塊。支援命令:

  • Create pid size:最佳適配分配(找≥size 的最小空閒塊,分配在其首部)
  • Delete pid:釋放進程佔用塊,合併相鄰空閒塊
  • Print:順序輸出內存表(P pid size / H size)
  • End:結束當前測試用例

數據結構:向量存儲內存塊

每塊:{id, type, size},type='P'/'H'。向量順序即物理順序。操作:

  • 分配:遍歷找最佳空閒塊,分裂(修改原塊大小,插入新進程塊)
  • 釋放:找到進程塊,標記為 H,檢查前後相鄰是否為 H,合併
  • 打印:遍歷向量輸出

關鍵細節

  • 最佳適配:遍歷所有空閒塊,記錄 size ≥ need 且 size 最小 的(同尺寸取最先)
  • 合併邏輯:釋放後檢查前驅和後繼,若為 H 則合併(注意向量迭代器失效)
  • 輸入以 End 分隔用例,T 組數據

核心代碼片段


struct Block { int id; char type; int size; };
vector mem;

void create(int pid, int sz) {
    int bestIdx = -1, bestSize = 1e9;
    for (int i=0; i= sz && mem[i].size < bestSize)
            bestSize = mem[i].size, bestIdx = i;
    if (bestIdx == -1) { puts("No enough memory!"); return; }
    Block proc = {pid, 'P', sz};
    mem[bestIdx].size -= sz;
    mem.insert(mem.begin()+bestIdx, proc);
    if (mem[bestIdx+1].size == 0) mem.erase(mem.begin()+bestIdx+1);
    printf("Create process %d of size %d successfully!\n", pid, sz);
}

void deleteProc(int pid) {
    for (int i=0; i0 && mem[i-1].type=='H') {
                mem[i-1].size += mem[i].size;
                mem.erase(mem.begin()+i);
                --i;
            }
            // 合併後繼
            if (i+1

複雜度

  • 表項 ≤ 100,所有操作 O(表項數) 完全足夠
  • 向量插入/刪除 O(N),N≤100 極快
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved