六度空间理论(数据结构图,c语言版)

一、实验题目

六度空间理论是一个数学领域的猜想,又称为六度分割理论 (Six Degrees of Separation)。六度空间理论是20世纪60年代由美国的心理学家米格兰姆(Stanley Milgram) 提出的,理论指出:你和任何一个陌生人之间所间隔的人不会超过6个,也就是说,最多通过6个中间人你就能够认识任何一个陌生人。

1.案例分析

六度空间理论的数学模型属于图结构,我们把六度空间理论中的人际关系网络图抽象成一个不带权值的无向图G, 用图G 中的一个顶点表示一个人,两个人 ”认识” 与否,用代表这两个人的顶点之间是否有一条边来表示。这样六度空间理论问题便可描述为:在图 G 中任意两个顶点之间都存在一条路径长度不超过7的路径。 在实际验证过程中,可以通过测试满足要求的数据达到一定的百分比(比如 99.5%) 来进行验证。 这样我们便把待验证六度空间理论问题描述为:在图G 中,任意一个顶点到其余 99.5%以上的顶点都存在一条路径长度不超过 7 的路径。比较简单的一种验证方案是:利用广度优先搜索方法, 对任意一个顶点,通过对图 G的 "7层”遍历,就可以统计出所有路径长度不超过 7 的顶点数 从而得到这些顶点在所有顶点中的所占比例。

2.案例实现

算法中有关数据结构的定义如下:

// - - - -图的邻接表存储表示 - - - -
#define MVNum 100 //最大顶点数

typedef struct ArcNode  //边结点
{
    
	int adjvex;  //该边所指向的顶点的位置
	struct ArcNode* nextarc; //指向下一条边的指针
	//Otherinfo info; //和边相关的信
}ArcNode; 

typedef struct VNode //顶点信息
{
    
	//VerTexType data; 
	ArcNode *firstarc;	//指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型

typedef struct  //邻接表
{
   
	AdjList vertices; 
	int vexnum,arcnum;//图的当前顶点数和边数 
}ALGraph;

3.算法步骤

1.完成系列初始化工作:设变量 Visit_Num 用来记录路径长度不超过 7 的顶点个数,初值为0; Start 为指定的一个起始顶点, 置 visited[Start]的值为 true, 即将 Start 标记为六度顶点的始点;辅助队列 Q 初始化为空,然后将 Start 进队。
2.当队列Q非空,且循环次数小千7时,循环执行以下操作(统计路径长度不超过7的顶点个数):
• 队头顶点u出队;
• 依次检查 u 的所有邻接点 w, 如果 visited[w]的值为 false, 则将w标记为六度顶点;
• 路径长度不超过7的顶点个数 Visit_Num 加1 ;
• 将w进队。
3.退出循环时输出从顶点Start出发,到其他顶点长度不超过7的路径的百分比。

4.算法描述

void SixDegree_BFS(Graph G,int Start) 
{
   //通过广度优先搜索方法遍历G来验证六度空间理论,Start为指定的一个起点
	Visit_Num=O; //记录路径长度不超过7的顶点个数
	visited[Start]=true; //置顶点Start访问标志数组相应分址值为true
	InitQueue(Q); //辅助队列Q初始化, 置空
	EnQueue(Q,Start); //Start进队
	for(len=l;len<=7 && !QueueEmpty(Q);len++)//统计路径长度不超过7的顶点个数
	{
   
		DeQueue(Q,u}; //队头顶点u出队
		for(w=FirstAdjVex(G,u);w>=O;w=NextAdjVex(G,u,w)) 
		{
   //依次检查u的所有邻接点w, FirstAdjVex(G,u)表示u的第一个邻接点
		 //NextAdjVex(G,u,w)表示u相对于w的下一个邻接点,w匀表示存在邻接点
			if(!visited[w]) //w为u的尚未访问的邻接顶点
			{
   
				visited[w]=true; //将w标记为六度顶点
				Visit_Num++; //路径长度不超过7的顶点个数加1
				EnQueue(Q,w); //w进队
			}//if 
		}
	}//结束至多7次for循环
	cout
  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
六度空间理论是指通过最短路径将任意两个人联系起来,最多只需要6次传递信息。在数据结构中,可以使用来表示人与人之间的关系,然后使用最短路径算法(如Dijkstra算法)来求解最短路径。 以下是使用Python实现六度空间理论的代码示例: ```python # 的邻接表表示 graph = { 'Alice': ['Bob', 'Claire', 'David'], 'Bob': ['Alice', 'Elle', 'Fred'], 'Claire': ['Alice', 'David', 'George'], 'David': ['Alice', 'Claire', 'George'], 'Elle': ['Bob'], 'Fred': ['Bob'], 'George': ['Claire', 'David'] } # Dijkstra算法求解最短路径 def dijkstra(graph, start, end): # 初始化距离和前驱节点 distances = {vertex: float('inf') for vertex in graph} distances[start] = 0 predecessors = {vertex: None for vertex in graph} # 用set存储未处理的节点 unvisited_nodes = set(graph) while unvisited_nodes: # 选取距离最短的节点 current_node = min(unvisited_nodes, key=lambda node: distances[node]) # 如果已经到达终点,结束搜索 if current_node == end: break # 更新当前节点的邻居节点的距离和前驱节点 for neighbor in graph[current_node]: new_distance = distances[current_node] + 1 if new_distance < distances[neighbor]: distances[neighbor] = new_distance predecessors[neighbor] = current_node # 将当前节点标记为已处理 unvisited_nodes.remove(current_node) # 没有找到最短路径 if distances[end] == float('inf'): return None # 构造最短路径 path = [] current_node = end while current_node != start: path.insert(0, current_node) current_node = predecessors[current_node] path.insert(0, start) return path # 测试代码 start = 'Alice' end = 'George' path = dijkstra(graph, start, end) if path: print(f"The shortest path from {start} to {end} is: {' -> '.join(path)}") else: print(f"No path from {start} to {end} exists") ``` 输出结果为: ``` The shortest path from Alice to George is: Alice -> David -> George ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值