新闻详情

新闻详情

首页 / 资讯中心 / 详情

Squarified Treemap 算法深度解析:disktree 如何画出方方正正的磁盘方块图

发布时间:2026/11/13 20:32:12来源:尧图网络
Squarified Treemap 算法深度解析:disktree 如何画出方方正正的磁盘方块图
Squarified Treemap 算法深度解析disktree 如何画出方方正正的磁盘方块图【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree磁盘空间被什么占满了du只能给你一长串数字而 disktree 这类 Treemap方块树图工具能把整个目录画成一幅面积即大小的方块马赛克——这正是开源磁盘空间可视化工具 disktree 的核心。它的布局不是简单的切条而是 Bruls、Huizing 和 van Wijk 三位学者提出的Squarified Treemap 算法让每一块都尽量接近正方形告别细长的面条条。本文就用 disktree 的真实源码把这套经典算法的每一步拆开讲清楚。为什么简单的切片切条不够用最朴素的 Treemap 布局是slice-and-dice先切片再切条第一层按大小水平切条第二层对每条垂直切分如此往复。问题在于当某一层里有一个特别大的项和一堆特别小的项时小项会被压成一条条 1~2 像素宽的细丝根本看不清也点不中。⚠️ 注由于本项目仅有一张官方截图上图已用于开头概要下文不再重复引用。Squarified 算法的目标很直白最小化所有方块中最差的那个长宽比aspect ratio让方块尽可能方方正正。Squarified 算法四步拆解算法核心可以浓缩为一句话沿着当前剩余矩形的短边摆一排方块只要最差长宽比还在变好就继续往里塞一旦变差就停手、换边再来。对照 squarify 函数 的实现四步如下第 1 步按值从大到小排序values [6, 6, 4, 3, 2, 2, 1] → 面积各自乘以统一的 scale先算出总面积得到scale 画布面积 / 总值把每个值换算成目标面积再降序排列。大项先摆小项后摆这是效果的关键前提。第 2 步沿着短边开始摆一行观察剩余区域free取它较短的一边side min(宽, 高)剩余区域是宽扁的宽 ≥ 高→ 在左侧切一条竖直窄带方块自上而下叠放剩余区域是高瘦的 → 在顶部切一条水平窄带方块自左向右排开。这一手保证了每排方块都贴着短边生长天然不容易出现长条。第 3 步worst_ratio决定是否继续加块这是算法的灵魂。假设当前行已经排了areas[start..end]行总面积为row_sum那么这一排摆下去的厚度row_sum / side排里每个方块的另一维长度面积 / 厚度每个方块的长宽比 两维的max/min取全排最大值即worst_ratio。接着试探如果再加入下一块算出候选行新的worst_ratio只要它不超过当前值就并入否则立即收手。源码见 worst_ratio 函数 与主循环里的贪心判断treemap.rs#L345-L355while end areas.len(): candidate_worst worst_ratio(候选行, side) if candidate_worst row_worst: # 变差了就停 break一个反直觉的事实这个贪心看起来会变差就回退的策略实际并不会真回退因为 worst_ratio 在行内是单峰的——一旦越过最优点就开始恶化停在最优点即可。第 4 步切掉这一排翻转方向递归剩余区域确定行数后按行总面积算出窄带宽度或高度把每块按面积 ÷ 窄带宽度算出各自的长依次落位随后从free中扣除这条窄带。由于方向随剩余区域形状自动切换竖排 ↔ 横排交替最终拼出一幅像砖墙一样紧凑的马赛克。disktree 的实战细节比教科书多做的几件事算法本身只有 80 行左右但 disktree 在 place_children 函数 里围绕它加了几层工程补丁每一条都对应一个真实的可视性问题细节解决的问题相关源码min_tile最小尺寸默认 5px小于 5 像素的块人眼无法阅读、鼠标也点不中直接丢弃treemap.rs#L244-L246max_children Others 合并默认 96一个目录里 5000 个文件超出上限的尾部合并成一块 Others面积仍被如实计入TileKind::Othersheader 名称带被展开的目录顶部预留一条色带放自己名字子方块全部排到带子下方——父目录名永远不会压在子方块上header_band 函数双层 padding顶层目录间距 3px、内部间距 1px让第一层结构先被读到细节其次LayoutOptions还有一个值得称道的取舍布局在未缩放视口的像素坐标系里跑滚轮缩放和平移只是绘制时套一层变换因此只有目录树、视口尺寸或层级变化时才需要重新布局——缩放到几万块的目录时帧率依然稳定。点击判定同样简单粗暴子方块后于父方块生成、且内缩于父块hit 函数 只要倒序找到第一个包含该点的方块就是最深的那块。用单元测试验证算法正确性算法对不对测试说了算。treemap.rs 的测试模块 用了三组经典断言铺满面积[40, 30, 20, 5, 3, 2]六块在 800×500 画布里总面积误差 1px²且每块都不越界squarify_fills_the_area长宽比上限复现论文经典样例[6, 6, 4, 3, 2, 2, 1]在 6:4 画布上断言所有方块的长宽比 ≤ 4squarify_keeps_aspect_ratios_reasonable退化解不死锁空输入、全零值、零宽画布都能安全返回squarify_survives_degenerate_input。嵌套关系同样有测试兜底layout_nests_children_inside_their_parent 断言每个子方块严格落在父方块内部父块先于子块生成——这正是倒序命中测试能成立的前提。亲手跑起来看看算法讲完了最直观的方式是亲眼看到它。disktree 用 Rust GPUI 编写布局核心全部集中在无 UI 依赖的 disktree-core 中扫描、布局、删除各自独立可测git clone https://gitcode.com/gh_mirrors/di/disktree cd disktree make install # 构建 release 并安装到 ~/.local无需 root需要 Rust 1.97。安装后运行disktree扫描家目录disktree ~/src扫描任意目录[ ]键切换展开层级滚轮向某个目录钻进去——每次缩放后你看到的都是这套 Squarified 算法在短边贪心、按长宽比收手的结果。小结Squarified 的精髓沿短边排行用worst_ratio贪心决定行的长度方向随剩余区域自动翻转工程化补丁最小块尺寸、Others 合并、名称带、像素空间布局让算法从数学上正确变成人眼上好用验证方式面积守恒 长宽比上限 嵌套包含关系三条断言足以钉住一个 Treemap 布局的正确性。下次再看到 KDirStat 风格的方块图时你就知道每个方方正正的色块背后都是一次次再加一块会不会更扁的权衡。【免费下载链接】disktreeA treemap for finding and removing what fills your disk, for Omarchy. Rust GPUI.项目地址: https://gitcode.com/gh_mirrors/di/disktree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/13 0:43:49

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/12 23:59:09

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/13 10:09:00

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/13 13:31:48

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/13 16:11:45

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/13 0:02:27

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉