E-内存资源分配(100p)
内存资源分配
问题描述
有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源。用户会进行一系列内存申请,需要按需分配内存池中的资源并返回申请结果成功失败列表。
分配规则如下:
- 分配的内存要大于等于内存的申请量,存在满足需求的内存就必须分配,优先分配粒度小的,但内存不能拆分使用。
- 需要按申请顺序分配,先申请的先分配,有可用内存分配则申请结果为 true。
- 没有可用则返回 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中的"优先分配粒度小的"要求来分配内存。
然后,我们遍历申请列表,对每个申请进行处理:
- 从最小的内存粒度开始查找,找到第一个大于等于申请量的可用内存。
- 如果找到了合适的内存,就将其分配出去,并在资源列表中减少相应的可用数量。
- 如果没有找到合适的内存,就返回 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%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记