- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个由大约 35,000 个节点组成的图,以纯文本表示:
node1 -> node35000
node29420 -> node35000
node2334 -> node4116
...
我想通过删除不属于至少三个长度的链的节点来减少它。所以如果我只有
1 -> 2;
2 -> 3;
3 -> 4;
0 -> 4;
我想保留 1、2、3 和 4(因为 1 -> 2 -> 3 -> 4
是四个节点长)但丢弃 0,即删除 0 -> 4
。
有什么好方法可以做到这一点吗?我尝试了 Perl 和 shell 函数的组合,但我认为我需要一种更好的方法。除非可能已经有工具可以做到这一点?数据采用 graphviz 格式,但我没有在该套件中看到任何与手头任务相关的工具。
哦,如果有一种简单的方法来做这样的事情,我愿意接受建议——它不需要完全是我建议的任务。我只是在寻找一种方法来消除大团 block 周围的大部分噪音(这种情况很少见,而且大多只是一些相交的链条)。
最佳答案
工具gvpr这是 graphviz tools 的一部分允许将规则应用于图形并输出修改后的图形。
来自描述:
It copies input graphs to its output, possibly transforming their structure and attributes, creating new graphs, ...
看起来您想删除所有入度为 0 且仅具有出度为 0 的链接节点(后继节点)的节点。
这是我的 gvpr
脚本 nostraynodes.gv
版本:
BEGIN {node_t n; int candidates[]; int keepers[];}
E{
if (tail.indegree == 0 && head.outdegree == 0)
{
candidates[tail] = 1;
candidates[head] = 1;
}
else if (tail.indegree == 0)
{
keepers[tail] = 1;
}
else if (head.outdegree == 0)
{
keepers[head] = 1;
}
}
END_G {
for (candidates[n]){
if (n in keepers == 0)
{
delete(NULL, n);
}
}
}
这是脚本的作用:
遍历所有边一次并填充两个列表:
那么什么被添加到哪个列表?
此解决方案不是通用的,仅适用于问题中所述的问题,即仅保持至少 3 个节点长的链。它也不会删除短循环(两个节点相互连接)。
您可以使用以下行调用它:
gvpr -c -f .\nostraynodes.gv .\graph.dot
使用示例图的输出是:
digraph g {
1 -> 2;
2 -> 3;
3 -> 4;
}
请注意,这是我的第一个 gvpr
脚本 - 可能有更好的方法来编写它,我不确定它如何处理 35000 个节点,但我相信这不应该一个大问题。
另见 Graphviz/Dot - how to mark all leaves in a tree with a distinctive color?一个更简单的图形转换示例。
关于algorithm - 修剪杂散节点的大图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7355241/
我有两种尺寸的图像(垂直和水平),它们将始终具有相同的尺寸,恭敬。我正在尝试创建一个容器来容纳图像但不会将内容推到上面并保持相似的高度或宽度。我也不想显示完整尺寸的图像,所以我在考虑使用 overfl
我有一个使用该类的 LaTeX 文档 \documentclass[12pt,a4paper]{scrbook} 我更改了一些用于定位浮点数的参数: \renewcommand{\topfractio
我有一个问题想和你分享。 所以就在这里。想象一下,我有一个非常大的图像,当我打开我的页面时它需要很重的负载。如果我想要将图像剪切成许多小块并在加载图像时将它们一个接一个地合并(只是 javascrip
我正在学习 Java SE 6.0。 是否有一张大图或图表来说明 Java 6.0 的所有类以及它们之间的关系? 提前致谢。 尊敬的 stackoverflow 开发人员和程序员。 你好。非常感谢您对
我得到了一个 InflateException 并且抛出了一个 OutOfMemoryError 异常。我知道我应该能够通过减小图像的大小/分辨率,或者通过将 android:largeHeap="t
我必须引用 id 从服务器到 android 移动设备检索所有大小的图像,所以我尝试使用下面的编码并成功获得 base 64 字符串并检索等效 base64string 的图像它适用于小尺寸图像但当我
我是一名优秀的程序员,十分优秀!