图论算法(2)--- 如何求DAG中每一个点的所有子孙数量

本文介绍如何利用BFS算法求解有向无环图(DAG)中每个节点的所有子孙数量,这一问题源于节点信息熵的定义——log(d(node)),其中d(node)表示节点的子孙总数。为了在计算信息熵时避免叶子节点子孙数为0,文中提出在计算时对所有节点的子孙数加1。
摘要由CSDN通过智能技术生成

问题引入:

上篇文章我们的问题引入中提到了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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值