图论算法(2)--- 如何求DAG中每一个点的所有子孙数量
来源:互联网 发布:科比0506赛季详细数据 编辑:程序博客网 时间:2024/06/05 18:31
问题引入:
上篇文章我们的问题引入中提到了DAG中的LCA定义问题,其实对于节点信息熵,其中的一种定义就是-log(d(node)),d(node)也就是求这个节点的所有子孙数量,那么自然而然,我们就想到了用BFS的思想,由于我们最终要计算信息熵(将在后续文章之图论算法DAG中LCA的算法实现里体现)并根据信息熵决定两个节点之间的相似度,所以对于所有节点我们都给它实际的子孙数量加1,这样就避免了叶子节点子孙数量为0的情况,否则计算信息熵时取log就没有意义。
import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.io.PrintStream;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.LinkedList;import java.util.Map;import java.util.Queue;import java.util.Set;public class DescendentsICCalculator {Map<String, LinkedList<String>> graph;Map<String, Integer> outmap;int total;public DescendentsICCalculator(String path) {String[] strs;String str;total = 0;try {BufferedReader br = new BufferedReader(new FileReader(path));graph = new HashMap<String, LinkedList<String>>();outmap = new HashMap<String,Integer>();while ((str = br.readLine()) != null) {strs = str.split("\\s");if (graph.containsKey(strs[1])) {graph.get(strs[1]).add(strs[0]);} else {LinkedList<String> linkedlist = new LinkedList<String>();linkedlist.add(strs[0]);graph.put(strs[1], linkedlist);}}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public void computeEachNodeDescendentsNum() {Queue<String> queue;Queue<String> adj;Set<String> visit;Set<String> visitleaf;Set<String> keys = graph.keySet();Iterator<String> it = keys.iterator();int cnt = 0;while (it.hasNext()) {cnt=0;String currentnode = it.next();queue = new LinkedList<String>();adj = new LinkedList<String>();visit = new HashSet<String>();visitleaf = new HashSet<String>();//判断叶子节点queue.add(currentnode);visit.add(currentnode);while (!queue.isEmpty()) {String nextnode = queue.poll();adj = graph.get(nextnode);if (adj == null) {if (!visitleaf.contains(nextnode)) {visitleaf.add(nextnode);outmap.put(nextnode + " ", 1);}continue;}Iterator<String> itadj = adj.iterator();while (itadj.hasNext()) {String neighbor = itadj.next();if (!visit.contains(neighbor)) {queue.add(neighbor);visit.add(neighbor);cnt++;}}}System.out.println(currentnode+ " " +(cnt+1));outmap.put(currentnode, (cnt + 1));}}public Map<String,Integer> getAllDescendentsNum(){return outmap;}public static void main(String[] args) throws IOException {DescendentsICCalculator cal = new DescendentsICCalculator("c:/depthcounter/newdataid.nt");cal.computeEachNodeDescendentsNum();Map<String,Integer> results = cal.getAllDescendentsNum();PrintStream out = new PrintStream("c:/depthcounter/rrrrallDescendentsIdCnt.nt");Iterator<String> it = results.keySet().iterator();while(it.hasNext()){String s = it.next();out.println(s+" "+results.get(s));}out.close();}}
0 0
- 图论算法(2)--- 如何求DAG中每一个点的所有子孙数量
- 图论算法(1)--- 如何求每一个节点在DAG中的最大深度
- poj2186 求有向图G中所有点都能到达的点的数量
- 求二叉树的每个结点的子孙数量
- poj1523—SPF(tarjan算法求无向图中所有的割点)
- loj 1257 (求树上每一个点到树上另一个点的最长距离)
- poj 2186 (求一个图中可以到达所有点的点的个数) (强连通)
- 统计每一个字母在一句话中出现的数量
- 【codeforces 721C】【DAG 按照拓扑排序记忆化DFS】C. Journey 【DAG图,5000个点,5000条边 让你求从1到n的路径长度不超过T中经过点数最多的一条 】
- ZOJ1032-Area 2(已知点坐标求多边形面积,求线段上的整点数量,pick定理)
- oracle中生成树中每个节点对应其所有子孙的映射
- CUGB图论专场2:I - Popular Cows 求受所有牛仰慕的牛(Tarjan缩点)
- 编写算法,求所有包含字符串S中而不包含字符串T中的字符串,构成的新串r以及r中每一个字符在S中第一次出现的位置
- 紫书p263 嵌套矩形如何输出所有路径(DAG上的动态规划)
- 图论算法-求(有向)图中任意两点间所有路径
- 图论算法-求(有向)图中任意两点间所有路径
- dijkstra(n^2)求某个点到所有点的最短路径
- 求图的所有哈密顿环算法2
- 触发器和锁存器的概念及FPGA中的使用
- 求数组最大k个数的问题(堆的应用)
- redis设置密码
- JAVA基础 (三)反射 深入解析反射机制
- css_div实现边框效果
- 图论算法(2)--- 如何求DAG中每一个点的所有子孙数量
- KVM虚拟机代码揭秘——QEMU代码结构分析
- 《JavaScript高级程序设计 第三版》学习笔记 (四) 对象创建详解
- php语法注意
- 【转】国外优秀开源PHP建站程序一览
- 水皮杂谈:中国经济有多少“瑜亮情结”?
- shell文本过滤编程(九):sed命令
- linq语法之Where First、FirstOrDefault Single...
- 英文电邮札记