绘制分层树:树形图

时间:2010-02-21 04:50:48

标签: graphics tree algorithm

我正在尝试开发一个分层树的视图,其中每个节点的权重是它拥有的实际子节点数。叶节点的权重为1。

我希望通过在开头显示根类别(没有父级)来浏览这些项目以便更深入到树中。单击某个节点会使视图重绘为仅显示该节点的子节点。

棘手的部分是,与邻接节点相比,节点的像素大小应与其权重成比例。根据维基百科,这被称为treemapping,我需要的是一个平铺算法,我试图自己弄清楚,但它似乎比我预期的更复杂..

举个例子,Mac OS X程序名为 GrandPerspective ,显示 HD 的文件夹大小:

alt text http://origin.arstechnica.com/journals/apple.media/540/GrandPerspectiveScreen.png

我想以这样的方式安排节点! (当然大小与文件夹大小成正比)

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:2)

您显示的文件系统示例中使用的数据结构很可能是KD tree。我不确定你要解决的问题如何映射到文件系统示例,但这就是我自己解决文件系统案例的方法:

首先是一个代表硬盘根目的矩形。 您获取目录中的所有文件和目录,并为它们指定大小。

  1. 对于文件,大小是文件的大小
  2. 对于目录,大小是它包含的所有文件的完整大小(包括其所有子文件夹及其子文件夹等)。
  3. 现在,您尝试将此列表切割为两个尽可能相同大小的列表。现在,您将输入矩形切割为两个矩形,其大小与您将输入文件切割成的两个列表相同。您应该沿着比输入矩形大小更短的轴进行切割,以确保始终具有尽可能方形的矩形。现在,您可以在两个列表上以递归方式运行算法及其对应的矩形。

    基本案例将是:

    1. 列表中只有一个文件。然后使用文件类型的颜色填充矩形。
    2. 列表中有一个目录。对于这种情况,您可以递归地对矩形内的目录中的内容运行算法。
    3. 选择如何将列表分成两个尽可能相同大小的部分可能并不简单(是knapsack?)。一个不错的启发式方法可能是按降序对列表进行排序,并将这些元素从列表中取出并将其放入当前最小的两个结果列表中。

      编辑:分裂问题称为partition,是背包的特例。这里有thread在SO上的内容。

答案 1 :(得分:2)

这是一个方形树形图。您可以阅读the paper解释此技术。