Brandes算法计算无向图节点最短路径之和-Java代码实现(1)

import java.util.*;

public class Main {

public static void main(String[] args) {
// 获取JSON对象,该对象包含了图的节点和边信息
JSONObject graphJson = getJsonObject();

// 创建邻接表表示图结构,键为节点ID,值为连接到该节点的所有节点ID列表
Map<String, List> adjacencyList = new HashMap<>();
// 创建一个HashSet存储所有节点ID
Set nodesSet = new HashSet<>();

// 解析JSON对象中的"nodes"数组,获取所有节点ID并添加到nodesSet中
JSONArray nodesArray = graphJson.getJSONArray(“nodes”);
for (int i = 0; i < nodesArray.length(); i++) {
JSONObject nodeObj = nodesArray.getJSONObject(i);
String nodeId = nodeObj.getString(“id”);
nodesSet.add(nodeId);
}

// 解析JSON对象中的"edges"数组,构建邻接表
JSONArray edgesArray = graphJson.getJSONArray(“edges”);
for (int i = 0; i < edgesArray.length(); i++) {
JSONObject edgeObj = edgesArray.getJSONObject(i);
String source = edgeObj.getString(“source”);
String target = edgeObj.getString(“target”);

// 假设图是无向的,所以在邻接表中双向添加边
adjacencyList.computeIfAbsent(source, k -> new ArrayList<>()).add(target);
adjacencyList.computeIfAbsent(target, k -> new ArrayList<>()).add(source);
}

// 计算并存储每个节点的中介中心性
Map<String, Double> nodeCentralities = new HashMap<>();
for (String nodeId : nodesSet) {
double centrality = calculateBetweennessCentrality(adjacencyList, nodeId);
nodeCentralities.put(nodeId, centrality);
}

// 将节点按照其中介中心性降序排列
List<Map.Entry<String, Double>> sortedNodes = new ArrayList<>(nodeCentralities.entrySet());
sortedNodes.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));

// 输出每个节点及其对应的中介中心性
System.out.println(“节点:该节点到其他节点最短路径距离之和:”);
for (Map.Entry<String, Double> entry : sortedNodes) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}

// 从固定JSON字符串中创建并返回JSONObject
private static JSONObject getJsonObject() {
String jsonData = “{“nodes”:[\n” +
“{“id”:“3.1”},\n” +
“{“id”:“4.1”},\n” +
“{“id”:“4.4”},\n” +
“{“id”:“2.3”},\n” +
“{“id”:“1.1”},\n” +
“{“id”:“1.2”}\n” +
“],\n” +
““edges”: [\n” +
" {\n" +
" “id”:“e1”,\n" +
" “source”: “3.1”,\n" +
" “target”: “4.1”\n" +
" },\n" +
" {\n" +
" “id”:“e2”,\n" +
" “source”: “4.4”,\n" +
" “target”: “4.1”\n" +
" },\n" +
" {\n" +
" “id”:“e3”,\n" +
" “source”: “3.1”,\n" +
" “target”: “4.4”\n" +
" },\n" +
" {\n" +
" “id”:“e4”,\n" +
" “source”: “4.1”,\n" +
" “target”: “2.3”\n" +
" },\n" +
" {\n" +
" “id”:“e5”,\n" +
" “source”: “4.4”,\n" +
" “target”: “1.1”\n" +
" },\n" +
" {\n" +
" “id”:“e6”,\n" +
" “source”: “1.2”,\n" +
" “target”: “1.1”\n" +
" }\n" +
" ]\n}";

JSONObject graphJson = new JSONObject(jsonData);
return graphJson;
}

// 根据给定的邻接表和节点ID,计算该节点的中介中心性
private static double calculateBetweennessCentrality(Map<String, List> graph, String node) {
// 初始化用于计算中介中心性的三个HashMap
Map<String, Integer> sigma = new HashMap<>();
Map<String, Double> delta = new HashMap<>();
Map<String, Double> betweenness = new HashMap<>();

// 初始化所有节点的sigma、delta和betweenness值
for (String v : graph.keySet()) {
sigma.put(v, 0);
delta.put(v, 0.0);
betweenness.put(v, 0.0);
}

// 设置当前节点的sigma值为1
sigma.put(node, 1);

// 创建队列(BFS)和栈(用于回溯),以及预处理器列表和距离映射表
Queue queue = new LinkedList<>();
Stack stack = new Stack<>();
Map<String, List> predecessors = new HashMap<>();
Map<String, Integer> distances = new HashMap<>();

// 初始化所有节点的预处理器列表和距离值
for (String v : graph.keySet()) {
predecessors.put(v, new ArrayList<>());
distances.put(v, -1);
}

// 将当前节点加入队列,并设置距离为0
queue.offer(node);
distances.put(node, 0);

// 开始广度优先搜索(BFS)
while (!queue.isEmpty()) {
String v = queue.poll();
stack.push(v);

// 遍历当前节点的所有邻居节点
for (String w : graph.get(v)) {
// 如果邻居节点尚未访问过,则将其加入队列,并更新距离
if (distances.get(w) < 0) {
queue.offer(w);
distances.put(w, distances.get(v) + 1);
}

// 当前邻居节点与当前节点的距离等于二者直接相连的距离时,更新sigma值和预处理器列表
if (distances.get(w) == distances.get(v) + 1) {
sigma.put(w, sigma.get(w) + sigma.get(v));
predecessors.get(w).add(v);
}
}
}

// 回溯过程,计算中介中心性
while (!stack.isEmpty()) {
String w = stack.pop();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数大数据工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上大数据开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
img

正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注大数据获取)
[外链图片转存中…(img-A681yF0S-1712512853612)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值