【2025刷题笔记】- 内存资源分配

刷题笔记合集🔗

内存资源分配

问题描述

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

分配规则如下:

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

注意:不考虑内存释放

输入格式

输入为两行字符串

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

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

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

  • 申请列表不大于

输出格式

输出为内存池分配结果,结果用逗号分隔。

样例输入

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

样例输出

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. 首先将内存池按照粒度大小进行排序(升序),这样我们可以优先分配粒度小的内存。
  2. 对于每个内存申请,在排序后的内存池中找到第一个大于等于申请大小的内存块。
  3. 如果找到了合适的内存块,分配它并标记结果为true;如果未找到,标记结果为false。

一个关键优化点是使用二分查找来加速寻找合适内存块的过程。这是因为:

  • 资源列表可能长达1024个不同粒度
  • 申请列表可能长达100000个申请

如果对每个申请都线性遍历内存池,时间复杂度会达到O(1024 * 100000),这可能导致超时。而使用二分查找,可以将查找内存块的时间复杂度从O(n)降低到O(log n),整体时间复杂度降低到O(m * log n),其中m是申请列表的长度,n是内存池的长度。

在实现上,我们可以维护两个数组:一个保存内存粒度大小,另一个保存对应的可用数量。这样当某个粒度的内存用完时,可以方便地从数组中移除。

算法的时间复杂度是O(m * log n),其中m是申请列表的长度,n是内存池的长度。在最坏情况下,这是O(100000 * log 1024),这个复杂度对于给定的数据范围是可以接受的。

参考代码

  • Python
import sys  
input = lambda:sys.stdin.readline().strip()  

# 输入处理
pools_str = input()
applies_str = input()

# 解析内存池
pools = []
for item in pools_str.split(','):
    if ':' in item:
        size, count = map(int, item.split(':'))
        pools.append([size, count])

# 解析申请列表
applies = []
for item in applies_str.split(','):
    try:
        applies.append(int(item))
    except:
        # 处理异常输入,如空格
        pass

# 二分查找函数
def bin_search(sizes, target):
    """二分查找找到第一个>=target的位置"""
    l, r = 0, len(sizes) - 1
    while l <= r:
        mid = (l + r) // 2
        if sizes[mid] < target:
            l = mid + 1
        elif sizes[mid] > target:
            r = mid - 1
        else:
            return mid
    return l if l < len(sizes) else -1

# 主要处理逻辑
def proc_mem(pools, applies):
    # 按内存大小升序排序
    pools.sort(key=lambda x: x[0])
    
    # 分离出大小和数量数组便于操作
    mem_sizes = []
    mem_counts = []
    for s, c in pools:
        mem_sizes.append(s)
        mem_counts.append(c)
    
    res = []
    for req in applies:
        # 找到首个>=req的内存块
        idx = bin_search(mem_sizes, req)
        
        # 内存分配失败的情况
        if idx == -1 or idx >= len(mem_sizes):
            res.append("false")
            continue
        
        # 分配内存
        mem_counts[idx] -= 1
        res.append("true")
        
        # 如果该大小内存用完了,从列表中移除
        if mem_counts[idx] == 0:
            mem_sizes.pop(idx)
            mem_counts.pop(idx)
    
    return ','.join(res)

print(proc_mem(pools, applies))
  • Cpp
#include <bits/stdc++.h>
using namespace std;

// 二分查找函数
int bin_find(const vector<int>& sizes, int key) {
    int left = 0;
    int right = sizes.size() - 1;
    
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (sizes[mid] < key) {
            left = mid + 1;
        } else if (sizes[mid] > key) {
            right = mid - 1;
        } else {
   

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

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

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

全部评论

相关推荐

6月down后继续尝试~【intro】我是UCL(qs&nbsp;top&nbsp;10)城市空间科学硕士,本科是211机械设计制造及自动化(有工科逻辑底子👩🏻‍💻)过去几年,我的经历有点“跨界”,但核心一直围绕着&nbsp;数据分析&nbsp;+&nbsp;空间信息&nbsp;+&nbsp;可持续发展。📍林火遥感监测的研究(发表Remote&nbsp;Sensing论文);📍在浙大某实验室和关联企业中做过与数字孪生、碳排放评估相关的项目,参与一些算法和技术文件的编写。📍python/GIS研究伦敦超低排放区政策(ULEZ)对空气质量的影响;看起来跨度有些大,我其实一直在寻找同一个方向——用数据与空间技术理解和优化真实世界。(🔎详情CV哦)【认真碎碎念】今年6月后迫于求职环境压力,我申请了部分PhD(ESG、城市交通排放、碳中和方向♻️),期间主要在充实研究能力、读文献📄、和导师🧑‍🏫沟通,也因此有一段“空窗期”,希望遇到【不介意】我处于探索发展路径的伯乐呀(福利:面试官还有机会解锁这位&nbsp;理工+人文混血体&nbsp;的有趣副业经历👾)。【意向岗位/城市】希望寻找一份能结合我背景和「兴趣」的工作。意象方向:🌍&nbsp;GIS&nbsp;/&nbsp;遥感&nbsp;/&nbsp;城市数据分析🏙️&nbsp;智慧城市、可持续发展研究🌱&nbsp;碳中和、环境数据分析、ESG政策研究(感兴趣也正学习ing)💡&nbsp;技术与策略结合的岗位,如数据顾问、其他科技方向的项目助理|解决方案|科研研究助理等等意向地点:上海&nbsp;/&nbsp;深圳&nbsp;/香港(接受Hybrid或部分远程)。希望能加入一个包容多元复合型背景、愿意给年轻人自我学习自我成长机会的团队,不介意我“跨界”的路径,更看重逻辑能力、学习力和独立思考的硬实力和软实力。
你觉得哪一届的校招最难?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务