E-内存资源分配(100p)

内存资源分配

问题描述

有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源。用户会进行一系列内存申请,需要按需分配内存池中的资源并返回申请结果成功失败列表。

分配规则如下:

  1. 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用。
  2. 需要按申请顺序分配,先申请的先分配,有可用内存分配则申请结果为 true。
  3. 没有可用则返回 false。

注意:不考虑内存释放。

输入格式

输入为两行字符串:

第一行为内存池资源列表,包含内存粒度数据信息,粒度数据间用逗号分割。

  • 一个粒度信息内用冒号分割,冒号前为内存粒度大小,冒号后为数量。
  • 资源列表不大于 1024。
  • 每个粒度的数量不大于 4096。

第二行为申请列表,申请的内存大小间用逗号分割。

  • 申请列表不大于 100000。

输出格式

输出为内存池分配结果,用逗号分隔的布尔值列表。

样例输入1

64:2,128:1,32:4,1:128
50,36,64,128,127

样例输出1

true,true,true,false,false

样例解释

样例 解释说明
样例1 内存池资源包含:64K共2个、128K共1个、32K共4个、1K共128个的内存资源;
针对50,36,64,128,127的内存申请序列,分配的内存依次是:64,64,128,NULL,NULL,
第三次申请内存时已经将128分配出去,因此输出结果是:
true,true,true,false,false

数据范围

  • 内存池资源列表长度
  • 每个粒度的数量
  • 申请列表长度

题解

模拟

首先,需要解析输入的内存池资源列表,将其转换为易于操作的数据结构。一个好的选择是使用有序字典或有序列表,按内存大小从小到大排序。这样可以方便我们按照规则1中的"优先分配粒度小的"要求来分配内存。

然后,我们遍历申请列表,对每个申请进行处理:

  1. 从最小的内存粒度开始查找,找到第一个大于等于申请量的可用内存。
  2. 如果找到了合适的内存,就将其分配出去,并在资源列表中减少相应的可用数量。
  3. 如果没有找到合适的内存,就返回 false。

参考代码

  • Python
def allocate_memory(pool, requests):
    # 解析内存池资源列表
    memory_pool = {}
    for item in pool.split(','):
        size, count = map(int, item.split(':'))
        memory_pool[size] = count
    
    # 对内存池按大小排序
    sorted_sizes = sorted(memory_pool.keys())
    
    results = []
    for request in map(int, requests.split(',')):
        allocated = False
        
        # 找到最小的可用内存块
        for size in sorted_sizes:
            if size >= request and memory_pool[size] > 0:
                memory_pool[size] -= 1
                allocated = True
                break
        
        results.append(str(allocated).lower())
    
    return ','.join(results)

# 读取输入
pool = input().strip()
requests = input().strip()

# 调用函数并输出结果
print(allocate_memory(pool, requests))
  • Cpp
#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

string allocate_memory(const string& pool, const string& requests) {
    // 解析内存池资源列表
    map<int, int> memory_pool;
    istringstream pool_stream(pool);
    string item;
    while (getline(pool_stream, item, ',')) {
        int size, count;
        sscanf(item.c_str(), "%d:%d", &size, &count);
        memory_pool[size] = count;
    }
    
    // 对内存池按大小排序
    vector<int> sorted_sizes;
    for (const auto& pair : memory_pool) {
        sorted_sizes.push_back(pair.first);
    }
    sort(sorted_sizes.begin(), sorted_sizes.end());
    
    vector<string> results;
    istringstream request_stream(requests);
  

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
1
分享
牛客网
牛客企业服务