数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)

简介: 数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)

题目描述

六度空间理论的核心观点是,人类社交网络中的任何两个人之间,平均只需要通过不超过六个中间人(也就是六个社交关系)就可以建立联系。换句话说,你通过你认识的某个人,再通过他们认识的另一个人,以此类推,最终可以与世界上任何一个陌生人建立联系。


现假设给定了一个社交网络图,请对每个节点计算符合“六度空间”理论的节点占节点总数的百分比。

算法思路

对每个节点,进行广度优先搜索;

搜索过程中累计访问的节点数;

需要记录“层”数,仅计算6层以内的节点数。

伪代码

总体算法

void SDS()
{
    for( each V in G )
    {
        count = BFS(V);
        Output(count/N);
    }
}

BFS算法

int BFS(Vertex V)
{
    visited[V] = true;
    count = 1;
    level = 0;
    last = V;
    Enqueue(V, Q);
 
    while (!IsEmpty(Q))
    {
        V = Dequeue(Q);
        for (每个邻接点W of V)
        {
            if (!visited[W])
            {
                visited[W] = true;
                Enqueue(W, Q);
                count++;
                tail = W;
            }
        }
 
        if (V == last)
        {
            level++;
            last = tail;
        }
 
        if (level == 6)
            break;
    }
 
    return count;
}

伪代码解读

BFS算法

visited[V] = true; count = 1;

将起始节点 V 标记为已访问,并将计数器 count 初始化为 1。

level = 0; last = V;

初始化层级 level 为 0,最后一个节点 last 为起始节点 V。

Enqueue(V, Q);

将起始节点 V 入队,Q为队列,用于存储待访问的节点。

随后当队列不为空时进入while循环



从队列中取出一个节点 V。

然后开始遍历节点 V 的每个邻接点 W,即与节点 V 相连的节点。

如果邻接点 W 没有被访问过,则执行以下操作:

  • 将邻接点 W 标记为已访问。
  • 将邻接点 W 入队。

 

增加计数器 count,表示访问的节点数量,并更新最后一个节点的位置为 W。

 


如果当前节点 V 等于最后一个节点 last,表示完成了当前层的遍历。

所以就增加层级 level,并将最后一个节点更新为当前层的最后一个节点。


如果层级达到 6,即搜索到了六度空间的节点,跳出循环。


最后,返回从起始节点出发的路径上经过的节点数量。

 

对于tail以及last的作用:

图解

最开始,last等于V:

然后对节点1进行出队列操作存在在V中,并将节点1的所有邻接点入队,对节点1的最后一个邻接点赋给tail:

前面我们看到节点1已经出了队列,并被存储在V,判断V == last,如果相等,则表明已经遍历完一层了:

level++,把tail赋给last:

然后开始新一轮的循环,直到来到节点7,节点7的最后一个邻接点赋给tail,即节点19;此时last指向节点7;如此,通过last和tail来判断进入下一层。

 


end



目录
相关文章
|
8月前
|
机器学习/深度学习 算法 数据挖掘
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
没发论文的注意啦!重磅更新!GWO-BP-AdaBoost预测!灰狼优化、人工神经网络与AdaBoost集成学习算法预测研究(Matlab代码实现)
249 0
|
7月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
427 86
|
7月前
|
机器学习/深度学习 运维 算法
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
【微电网多目标优化调度】多目标学习者行为优化算法MOLPB求解微电网多目标优化调度研究(Matlab代码实现)
339 1
|
9月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
589 1
|
9月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
199 0
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
负载均衡 算法
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
2915 11
架构学习:7种负载均衡算法策略
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
393 59
|
10月前
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
223 0
栈区的非法访问导致的死循环(x64)

热门文章

最新文章