Leetcode2502:设计内存分配器

news/2025/2/26 14:10:11

题目描述:

给你一个整数 n ,表示下标从 0 开始的内存数组的大小。所有内存单元开始都是空闲的。

请你设计一个具备以下功能的内存分配器:

  1. 分配 一块大小为 size 的连续空闲内存单元并赋 id mID 。
  2. 释放 给定 id mID 对应的所有内存单元。

注意:

  • 多个块可以被分配到同一个 mID 。
  • 你必须释放 mID 对应的所有内存单元,即便这些内存单元被分配在不同的块中。

实现 Allocator 类:

  • Allocator(int n) 使用一个大小为 n 的内存数组初始化 Allocator 对象。
  • int allocate(int size, int mID) 找出大小为 size 个连续空闲内存单元且位于  最左侧 的块,分配并赋 id mID 。返回块的第一个下标。如果不存在这样的块,返回 -1 。
  • int freeMemory(int mID) 释放 id mID 对应的所有内存单元。返回释放的内存单元数目。

代码思路:

初始化 (__init__ 方法)

  • n: 表示总共有多少个元素(或内存块)可供分配。
  • container: 一个长度为 n 的列表,用于记录每个元素的归属(即哪个ID分配了这个元素)。初始时,所有元素都未被分配,因此列表中的值全部为 0
  • num_used: 记录当前有多少个元素被占用。

分配内存 (allocate 方法)

  • size: 请求分配的内存块大小(即连续的元素数量)。
  • mID: 请求分配内存块的ID(用于标识分配的内存块)。

步骤

  1. 预先判断:如果请求的内存块大小大于剩余可分配的元素数量(self.n - self.num_used),则直接返回 -1,表示分配失败。
  2. 寻找起始下标:从列表的开头开始,寻找第一个连续空闲的元素块,该块的大小至少为 size
    • 使用两个指针 i 和 j,其中 i 是当前考察的起始位置,j 是尝试扩展的结束位置。
    • 如果 self.container[i] 不为 0,表示该位置已被占用,i 向后移动一位继续寻找。
    • 如果 self.container[i] 为 0,则尝试扩展,直到找到一个连续空闲块的大小至少为 size 或到达列表末尾。
  3. 分配内存:如果找到了一个足够大的连续空闲块,则将这个块内的所有元素标记为 mID,并更新 num_used
  4. 返回结果:如果成功分配,返回起始下标 i;如果失败,返回 -1

释放内存 (freeMemory 方法)

  • mID: 要释放的内存块的ID。

步骤

  1. 遍历列表:遍历 container 列表,找到所有归属为 mID 的元素。
  2. 释放内存:将这些元素的值重置为 0,表示它们现在是空闲的。
  3. 更新计数:记录释放的元素数量,并从 num_used 中减去这个数量。
  4. 返回结果:返回释放的元素数量。

代码实现:

class Allocator:

    def __init__(self, n: int):
        self.n = n # 一共有多少个元素
        self.container = [0]*n # 每个元素归属哪个ID(ID为0表示当前下标空闲)
        self.num_used = 0 # 有多少个下标被占用
        
    def allocate(self, size: int, mID: int) -> int:
        if size > self.n-self.num_used: return -1 # 预先判断有没有可能分配内存
        i = 0 # 寻找起始下标
        while i<self.n-size+1:
            if self.container[i]:
                i += 1
                continue
            # 当前位置有空
            j = i # [i,j) 左右边界
            while j<self.n and self.container[j]==0 and j-i<size: j += 1
            # 看下j停下来的位置
            if j-i>=size: # 可以分配大小为size的连续内存
                for l in range(i,j): self.container[l]=mID
                self.num_used += size
                return i
            else: # 无法分配,跳过
                i = j
        return -1

    def freeMemory(self, mID: int) -> int:
        ans = 0
        for i in range(self.n):
            if self.container[i]==mID:
                self.container[i]=0
                ans += 1
        self.num_used -= ans
        return ans
        


# Your Allocator object will be instantiated and called as such:
# obj = Allocator(n)
# param_1 = obj.allocate(size,mID)
# param_2 = obj.freeMemory(mID)

 


http://www.niftyadmin.cn/n/5868812.html

相关文章

在ubuntu如何安装samba软件?

我们在开发过程中&#xff0c;经常修改代码&#xff0c;可以安装samba文件来实现&#xff0c;把ubuntu的存储空间指定为我们win上的一个磁盘&#xff0c;然后我们在或者磁盘里面创建.c文件&#xff0c;进行代码修改和编写。samba能将linux的文件目录直接映射到windows&#xff…

为AI聊天工具添加一个知识系统 之122 详细设计之63 实体范畴论和神经元元模型:命名法函子

本文要点 要点 本文讨论&#xff1a; 实体的范畴论&#xff08;三套论法&#xff09;&#xff1a; 一元论、二元论和三元论。神经元元模型 &#xff08;三层含义&#xff09; 暨 三种神经网络构造型 既 神经元三个功能约束 即 神经细胞元元模型。 注&#xff1a; 第一行是…

前端包管理工具进化论:npm vs yarn vs pnpm 深度对比

前端包管理工具进化论&#xff1a;npm vs yarn vs pnpm 深度对比 一、工具定位与核心差异二、功能特性对比三、优缺点深度解析四、性能实测对比&#xff08;示例数据&#xff09;五、选型建议六、未来趋势 一、工具定位与核心差异 npm (Node Package Manager) Node.js 官方捆绑…

社群团购平台的愿景构建与开源链动2+1模式S2B2C商城小程序应用探索

摘要&#xff1a;在数字经济背景下&#xff0c;社群团购作为一种新兴的商业模式&#xff0c;凭借其独特的互动性和便捷性&#xff0c;展现出巨大的市场潜力。本文旨在探讨社群团购平台愿景的构建策略&#xff0c;并结合开源链动21模式S2B2C商城小程序的应用&#xff0c;为创业者…

SAP-ABAP:使用ST05(SQL Trace)追踪结构字段来源的步骤

ST05 是 SAP 提供的 SQL 跟踪工具&#xff0c;可以记录程序运行期间所有数据库操作&#xff08;如 SELECT、UPDATE、INSERT&#xff09;。通过分析跟踪结果&#xff0c;可以精准定位程序中结构字段对应的数据库表。 步骤1&#xff1a;激活ST05跟踪 事务码 ST05 → 点击 Activa…

拍照自带解说?水印相机,让CAD照片标注“开口说话”!

在施工造价等领域的工作中&#xff0c;现场图片与图纸的结合使用是非常常见的场景。以往&#xff0c;我们可能会花费大量时间去整理和标记图片&#xff0c;以便与图纸准确对应。 现在&#xff0c;借助CAD快速看图-水印相机功能&#xff0c;这些问题都能轻松解决&#xff01; …

springboot志同道合交友网站设计与实现(代码+数据库+LW)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本志同道合交友网站就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信…

Transceivers Wizard IP核

Transceivers Wizard IP核 1. 基础配置&#xff08;Basic Configuration&#xff09; 1.1 收发器类型&#xff08;Transceiver Type&#xff09; 选项&#xff1a;GTP、GTX、GTH、GTZ&#xff08;根据具体FPGA型号选择&#xff09;。 GTP&#xff1a;低功耗&#xff0c;适用于…