K 氏堆 也 称为 K-堆 、K-Heap 。
题目 是 这样 :
我们要 设计一个 计算机 内存管理 的 堆 , 具体的说, 是 设计一个 堆 数据结构, 设计出 堆 的 算法 。
相比 实际 的 计算机 在 用 的 堆, 我们 这个 堆 是 理想的, 不用考虑 软件 、硬件 等 各种技术细节, 同时, 在 需求 上, 也作了简化 。
这个 堆 是 这样 :
给定一块 大小 确定 的 内存空间, 称为 div , 在 这块 内存空间(div) 里 分配 内存块, 内存块 用完 后 回收, 内存空间(div) 中 未被分配 的 空间 称为 空闲空间, 分配 是 从 空闲空间 里 分配, 从 空闲空间 里 分配 出 一个 内存块 后, 空闲空间 的 范围 相应 的 减小, 减小 的 大小 和 位置 就是 分配 出去 的 内存块 的 位置 和 大小 。
显然, 要 管理 堆, 也就是 管理 堆 的 分配 和 回收(分配 和 回收 内存块), 需要 记录 堆 的 使用状况, 比如 已 分配 的 内存块 和 剩余的 空闲空间 。
需要 一些 数据 来 记录 和 描述 堆 的 使用状况, 这些 记录 堆 的 使用状况 的 数据, 广义的, 用于 管理 堆 的 数据, 称为 堆元数据 , 通俗的说, 也可以叫做 堆管理数据 。
堆元数据 也 应该 保存在 堆 里, 也就是 保存在 div 里 , 也就是说 要 分配 一些 内存块, 用于 保存 堆元数据, 让 堆元数据 保存在 这些 内存块 里 。
堆元数据 也 保存在 堆 自身 里 , 这可以称为 “自己 管理 自己” 。
分配 的 时候 任意 取 一个 符合要求 的 空闲空间 用于 分配, 符合要求 是指 空闲空间 的 Size 足够 用于 分配, 这 要求 空闲空间 Size 大于 要分配 的 内存块 Size, 且 实际中 可能还会 保存一些 元数据, 可能 还要求 空闲空间 有 足够空间 保存这些 元数据, 这些可以根据 设计方案 而 定 。
总之, 怎么 获得 “符合要求 的 空闲空间 中 的 任意一个” , 这一点 不用考虑, 这是 题目 的 已知 条件 。
也就是说, 做题者 总是 可以 拿到 一个 符合要求 的 空闲空间 用于 分配, 这个 空闲空间 是 符合要求 的 空闲空间 中 的 任意一个 。
以上 是 题目 。
请 不要用 纸和笔, 纯粹 用 脑子 想象, 来 做 这个 题 。
请 给出 全部(尽可能多) 可能的 设计方案 , 包括 正确的方案 、错误的方案 和 不可能实现的方案 , 并 说明 错误方案 的 错误 是 什么, 不可能实现的方案 为什么 不可能实现, 矛盾在哪里 。
请 分析 和 指出 每一种 方案 中 可能 的 Bug 有 哪些 , 方案 包括 正确的方案 、错误的方案 和 不可能实现的方案 。
以上 是 题目 。
这题 算是 斧子智商题 。
什么是 “斧子智商题” ?
我 在 前几天 写 的 《关于 智商》 https://www.cnblogs.com/KSongKing/p/14453992.html 里 提到了 “水果智商题” , 也 用 “斧子” 做过比喻 。
你 让 做 水果智商题 得 高分 的 人 来 做 这题 试试 , 呵呵呵呵 。
这题 的 特色 是 这题 是 一个 经典 的 逻辑推理 和 系统设计 题目 , 也是 一个 正统 的 系统设计 题目 , 也是 一个 传统 的 系统设计 题目 。
这 题 需要 逻辑推理 、空间想象力 、系统设计 的 能力 。
设计出 一套 正确 的 方案 只是 开始, 更多 的 内容 是 设计 和 找出 其它 正确的 、错误的 、不可能的 方案 , 以及 这些 方案 可能 的 Bug 。
这 考验 的 是 持续 的 逻辑推理 、空间想象力 、归纳 、演绎 、设计 的 能力 。
抛开 计算机理论, 这题 是 一个 智力题 。
用 格子 、数字 、拼图 的 方式 把这题 描述 出来, 就是 一个 智力题, 也 挺有 “组合数学” 的 范 , 更多的是 趣味, 也可以叫 “趣味数学” 、“趣味逻辑” 、“趣味积木” 、“趣味搭建” 。
可以 让 做 “推理选择题” 得 高分 的 人 来 做 这题 试试 , 也可以让 做 “脑筋急转弯” 得 高分 的 人 来 做 这题 试试 。