【问题标题】:Venn Diagram Drawing Algorithms维恩图绘制算法
【发布时间】:2012-04-28 22:46:17
【问题描述】:

有人问到 GraphViz 中重叠子集群的问题,得到如下回复:

对不起,没有。一般子图可以共享节点而不隐含子集 遏制但不是集群。问题出在图中。 如果集群可以任意重叠,那么绘制它们就成了问题 绘制维恩图,没有好的算法。

什么是“绘制维恩图问题”的正式定义或示例?为什么它(我假设 NP-complete/hard)很难? (加分:对一个著名的 NP 完全问题进行简化)

【问题讨论】:

标签: algorithm venn-diagram


【解决方案1】:

你有N个点和一个二元关系R,你需要用图形表示关系,以便每个节点都由欧几里得平面上的一个圆表示,这样两个圆重叠当且仅当对应的节点n和n' 它认为 n R n'。

【讨论】:

  • 那么假设 N = 100,并且 i R j 对所有 i 和 j 都为真,那么图表会是什么样子?
  • 你有 100 个圆圈,它们都重叠。
  • 但是,正如您在 Wikipedia "Venn diagram" 中看到的那样,实际上有算法,由于 Venn 和其他人,可以或多或少地很好地绘制任意数量的 N 个区域(不是所有圆圈)在平面中显示所有 2^N-1 个交叉区域(加上所有这些区域之外的一个区域)。这些结构的问题是显而易见的:或多或少的审美判断、大量 2^N 的交叉区域以及使它们都足够大所需的空间。
【解决方案2】:

除了维恩图本身,我们可以在许多情况下使用 GraphViz 来实现相同的目的,使用对偶图,它是集合交集的布尔格。每个节点代表要包含的集合和要排除的集合的唯一选择。仅通过包含/排除单个集合而不同的节点被连接。

对于越来越多的集合,当然通常会有很多很多的节点和边。但是在许多实际设置中,会有很多集合根本不相交,因此可以省略那些相交节点以及从它们到其他节点的任何边。通过这种方法,节点和边的数量可以减少到一个实用的数量。

在布置结果图时,最好选择 GraphViz 算法“neato”并要求避免节点重叠。进行这些设置的一种方法是在图形的左大括号内写入 layout=neato,overlap=prism; .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多