寻找节点d=n的节点算法
这里的算法是毕设过程中,自己想到的,也不知道有不有人提出过。这里就记录下发现的过程的具体的算法,以后会用到
背景描述
毕设做的是「社交网络中病毒传播的预测」,前期过程主要是模拟几个网络的数据,然后从一个节点开始传播,研究传播过程的预测性。
其中一步,需要研究距离桥节点(两个网络的俩连接点)距离为n的节点为病毒源的传播过程。这里产生一个需求:寻找与节点A距离为n的节点们。
毕设过程基本是重复博士生姐姐已发表的论文,不过由于年轻气盛给导师说要自己做,只是博士生姐姐提供主线思路。每次都是自己做出来后,给博士生姐姐讲,然后给我讲他的。发现,寻找离节点A距离n的节点们,博士生姐姐都是用Dijkstra算法先把整个网络的节点距离算出来,再找需要的节点。
但是,这样做的缺点是浪费不必要的时间和空间,因为我们的需求中只需要计算距离特定点A长度d=n的节点们,而不需要计算所有节点的所有距离长度节点。
算法内容
算法思路是根据最直接的想法进行的,即 寻找与节点A距离d=n的节点算法:
- 寻找与节点A距离d=n-1的的邻居节点
- 第一步的节点中减去d=n-2,n-3,。。。,1,0的邻居节点
js写的伪代码(直接用的毕设时的数据结构)
/*
寻找网络Net中距离节点node距离distance的节点们
Net = {
'1': {
'status': 1, // 节点编号1的节点状态是已感染。
'connect': [2,3,4,5] // 节点编号1的节点的邻居节点。
},
...
}
*/
function findDistanceNodes(Net, node, distance) {
var findNodes = [];
if(distance == 0) {
findNodes.push(node);
} else {
// 寻找距离 distance - 1 的节点们的邻居们
var lastDistanceNodes = findDistanceNodes(Net, node, distance - 1);
for(var i =0; i < lastDistanceNodes.length; i++) {
findNodes = array_merge(Net[lastDistanceNodes[i]].connect, findNodes);
}
// 去重
findNodes = rmSameArr(findNodes); // 从刚才的邻居们中排除 距离node d=0,1,2,3,4,...distance-1的节点
for(var i = 0; i < distance; i++) {
findNodes = minArrFromArr(findNodes, findDistanceNodes(Net, node, i));
}
}
return findNodes; }
结尾
以上算法经过毕设结果验证,和博士生姐姐的结果一致,整体运行速度也比其快。 这里粗略记录下研究过程,希望也能感受到毕设中的苦与甜。
寻找节点d=n的节点算法的更多相关文章
- 寻找图的强连通分量:tarjan算法简单理解
1.简介tarjan是一种使用深度优先遍历(DFS)来寻找有向图强连通分量的一种算法. 2.知识准备栈.有向图.强连通分量.DFS. 3.快速理解tarjan算法的运行机制提到DFS,能想到的是通过栈 ...
- 剑指Offer(第二版)面试案例:树中两个节点的最低公共祖先节点
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/74612786冷血之心的博客) 剑指Offer(第二版)面试案例:树 ...
- 二叉树中两节点的最近公共父节点(360的c++一面问题)
面试官的问题:写一个函数 TreeNode* Find(TreeNode* root, TreeNode* p, TreeNode* q) ,返回二叉树中p和q的最近公共父节点. 本人反应:当时有点 ...
- 深入理解DOM节点类型第二篇——文本节点Text
× 目录 [1]特征 [2]空白 [3]属性[4]方法[5]性能 前面的话 文本节点顾名思义指向文本的节点,网页上看到的文字内容都属于文本节点.该节点简单直观,本文将详细介绍该部分内容 特征 文本节点 ...
- zigbee 路由节点丢失后清除 该节点的残余网络信息
清除脱离网络的 路由节点(stale device)的 残留在各表中以AssociationDevList为例的残余信息. 如图所示拓扑结构中: 路由器1脱离网络后,通过协调器按键操作来 清除 协调 ...
- Query节点操作,jQuery插入节点,jQuery删除节点,jQuery Dom操作
一.创建节点 var box = $('<div>节点</div>'); //创建一个节点,或者var box = "<div>节点</div> ...
- jQuery 获取当前节点的html包含当前节点的方法
在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到. 看到有的人通过pare ...
- MySql 获取当前节点及递归所有上级节点
-- MySql 获取当前节点及递归所有上级节点 -- 参数说明:resultField:查询返回字段,idd 要查询的资源ID值,idFieldName ID字段名,parentIdFieldNam ...
- hadoop 集群 加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令
加入一个新的存储节点和删除一个计算节点需要刷新集群状态命令 方式1:静态添加datanode,停止namenode方式 1.停止namenode 2.修改slaves文件,并更新到各个节点3.启动na ...
随机推荐
- Putty常用属性设置
1. 使用 UTF-8避免显示乱码 2.调整 Lines of scrollback,能够回看更多的控制台输出log 3.调整颜色和字体使得看上去更舒服 4.解决数字键盘无法输入数字的问题 效果图:
- python之网络socket编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- python读写Excel文件--使用xlrd模块读取,xlwt模块写入
一.安装xlrd模块和xlwt模块 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd-0.9. ...
- JavaScript:学习笔记(2)——基本概念与数据类型
JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...
- Django 补充models操作,中间件, 缓存,信号,分页
1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...
- iOS 什么是函数式编程
前言:当前只做理解性的常规背书,根据不断深入学习会不断丰富解读内容,欢迎评论提意见 函数式编程:Functional Programming 1 基本解释: 函数式编程 是一种思维模式,一种编程思想, ...
- Oracle网络服务管理与配置
一.Oracle网络服务概述 1.网络解决方案. (1)可连接性:在Oracle中,由Oracle net组件负责在客户端应用程序与数据服务器之间创建会话.维护会话连接和数据传输. (2)可管理性: ...
- QGIS 编译
QGIS 编译 在编译的过程中花费了很长时间,特别是编译Debug版本.release版本的编译可以从晚上找到很多的资料,但是Debug的编译相对较少.在Debug编译的过程中,需要单独build工程 ...
- Qt+数据库
前言支持内置数据库: 一.sqlite 1.在头文件中声明数据库对象 QSqlDatabase db; 2.在构造函数中定义对象(最好这样定义,因为对于db来说只需要addDatabase一次,否则多 ...
- 用vim写python脚本的自动缩进格式设置