zoukankan      html  css  js  c++  java
  • 出一道 智商题 : K 氏堆 问题

    K 氏堆 也 称为  K-堆 、K-Heap    。

     

    题目 是 这样 :

     

    我们要 设计一个 计算机 内存管理 的 堆 ,  具体的说, 是 设计一个 堆 数据结构,  设计出 堆 的 算法  。

     

    相比 实际 的 计算机 在 用 的 堆,   我们 这个 堆 是 理想的,  不用考虑 软件 、硬件 等 各种技术细节,  同时,  在 需求 上,  也作了简化    。

     

    这个 堆 是 这样 :

     

    给定一块 大小 确定 的 内存空间, 称为 div ,   在 这块 内存空间(div) 里 分配 内存块,  内存块 用完 后 回收,   内存空间(div) 中 未被分配 的 空间 称为 空闲空间,  分配  是 从 空闲空间 里 分配,  从 空闲空间 里 分配 出 一个 内存块 后,  空闲空间 的 范围 相应 的 减小,  减小 的 大小 和 位置 就是 分配 出去 的 内存块 的 位置 和 大小  。

     

    显然,  要 管理 堆,  也就是 管理 堆 的 分配 和 回收(分配 和 回收 内存块),   需要  记录 堆 的 使用状况,  比如 已 分配 的 内存块 和 剩余的 空闲空间  。

    需要 一些 数据 来 记录 和 描述 堆 的 使用状况,   这些 记录 堆 的 使用状况 的 数据,  广义的,  用于 管理 堆 的 数据,   称为 堆元数据 , 通俗的说,  也可以叫做 堆管理数据  。

     

    堆元数据 也 应该 保存在 堆 里,  也就是 保存在  div 里  ,   也就是说 要 分配 一些 内存块,  用于 保存 堆元数据,   让 堆元数据 保存在 这些 内存块 里   。

     

    堆元数据 也 保存在 堆 自身 里 ,   这可以称为    “自己 管理 自己”   。

     

     

    分配 的 时候 任意 取 一个 符合要求 的 空闲空间 用于 分配,    符合要求 是指 空闲空间 的 Size 足够 用于 分配,   这 要求 空闲空间 Size 大于 要分配 的 内存块 Size, 且 实际中 可能还会 保存一些 元数据,  可能 还要求 空闲空间 有 足够空间 保存这些 元数据,   这些可以根据 设计方案 而 定  。

     

    总之,  怎么 获得 “符合要求 的 空闲空间 中 的 任意一个”  ,   这一点 不用考虑,   这是 题目 的 已知 条件  。

     

    也就是说,  做题者 总是 可以 拿到 一个 符合要求 的 空闲空间 用于 分配,    这个 空闲空间 是 符合要求 的 空闲空间 中 的 任意一个  。

     

     

    以上 是 题目  。

     

    请 不要用 纸和笔,  纯粹 用 脑子 想象,    来 做 这个 题   。

     

    请 给出 全部(尽可能多) 可能的 设计方案 ,  包括 正确的方案  、错误的方案 和 不可能实现的方案 ,   并 说明 错误方案 的 错误 是 什么,  不可能实现的方案 为什么 不可能实现, 矛盾在哪里  。

     

    请 分析 和 指出 每一种 方案 中 可能 的 Bug 有 哪些  ,   方案 包括 正确的方案  、错误的方案 和 不可能实现的方案  。

     

     

    以上 是 题目  。

     

     

    这题 算是 斧子智商题  。   

     

    什么是  “斧子智商题” ?     

     

    我 在 前几天 写 的 《关于 智商》   https://www.cnblogs.com/KSongKing/p/14453992.html    里 提到了  “水果智商题” ,   也 用 “斧子” 做过比喻   。

     

    你 让 做 水果智商题 得 高分 的 人 来 做 这题 试试 ,        呵呵呵呵  。

     

     

    这题 的 特色 是   这题 是 一个 经典 的 逻辑推理 和 系统设计 题目 ,   也是 一个 正统 的 系统设计 题目  ,  也是 一个 传统 的 系统设计 题目  。

     

    这 题 需要    逻辑推理 、空间想象力 、系统设计  的 能力  。

     

    设计出 一套 正确 的 方案 只是 开始,   更多 的 内容 是 设计 和 找出 其它 正确的 、错误的 、不可能的 方案 ,   以及 这些 方案  可能 的 Bug   。

     

    这 考验 的 是  持续 的 逻辑推理 、空间想象力 、归纳 、演绎 、设计 的 能力   。

     

     

    抛开 计算机理论,         这题 是 一个 智力题  。

    用  格子 、数字 、拼图 的 方式 把这题 描述 出来,  就是 一个 智力题,   也 挺有 “组合数学” 的 范 ,  更多的是 趣味,  也可以叫  “趣味数学” 、“趣味逻辑”  、“趣味积木” 、“趣味搭建”    。

     

    可以 让 做 “推理选择题” 得 高分 的 人 来 做 这题 试试  ,   也可以让 做 “脑筋急转弯” 得 高分 的 人 来 做 这题 试试   。

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    3: Flink 运行命令 设置port
    4: docker 安装flink 1.14
    6: Docker Compose简单知识
    十二 docker 安装kafka
    十三 查看kafka版本
    2: Windows安装1.9.3 flink && first demo project
    5: win10 使用IDEA调试编译flink 1.14
    1: Windows上安装Flink
    Chrome 96 新功能
    js map遍历与promise一起使用会出现的问题,以及解决方案
  • 原文地址:https://www.cnblogs.com/KSongKing/p/14552344.html
Copyright © 2011-2022 走看看