002C语言 验证无标度网络的幂律定律

本文介绍了无标度网络的发展、特点和构造算法,并通过C语言编程实现了幂律定律的验证。文章详细展示了程序的运行流程,分析了程序的效率问题,同时分享了作者在编写技术博客过程中的收获和对后续学习的思考。
摘要由CSDN通过智能技术生成

1复杂网络发展史

几乎每个人都听说过大数学家欧拉和哥尼斯堡七桥的故事,而1736年29岁的欧拉向圣彼得堡科学院递交了《哥尼斯堡的七座桥》的论文,也正式标志着数学的一个新的分支——图论与几何拓扑创建起来了。但此后很长一段时间,图论都没有什么重大的进展,直到本世纪,随着计算机科学的发展及仿真技术的进步,图论才开始焕发生机。从1959年随机图理论的提出(后来发现有很大的局限性),到1967年的小世界实验(比这个实验更闻名遐迩的是“六度分隔”理论),再到1973年,Granovertter发现并研究弱连接的强度,再到1998年Watts和Strogatz正式建立小世界模型,次年Barabasi和Albert又提出了无标度网络并发现了其幂律特性。不得不感叹,计算机在研究此类问题中的丰功伟绩!下面重点介绍一下无标度网络。
2无标度网络
随机图理论中,点的连接是随机的,这就造成了他很大的局限性,想想我们的现实世界中,某个领域中必然是功成名就者更容易被新接触这个领域的人认识,等等不胜枚举。无标度网络的先进之处就在于用两个特性深刻的刻画了生活中这种实际网络。无标度网络中,将实际网络概括为以下两个特性(大家可以好好品味以下)
A增长特性:即网络的规模是不断扩大的。例如每个月都会有新的科研文章发表,而万维网上每天都会产生大量新的网页。

B优先连接:即新的节点更倾向于与那些具有较高连接度的“大”节点相连接。这种现象也成为“富者更富”或“马太效应(Matthew Effect)”。例如新发表的文章更倾向于引用一些已经被广泛引用、有较高知名度的重要文献,新的个人主页上的超文本链接更有可能指向新浪、雅虎等著名站点。

解释一些关键概念:

连接度k:与该节点连接的其他节点的数量;

聚类系数C:与该节点相连的节点中实际连接的数目,与理论上最大连接数目的比值。

无标度网络的构造算法如下:

这里还要介绍一个邻接矩阵的概念,我这里实际上只使用了上三角部分。具体的构建思路在下面求k值部分有图示。

3编程实现

先祭出一张原理图


A、定义相关结构体及函数

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

int NumberofNodes = 0;
int NumberofBeginners = 0;
int NumberofLinks = 0;
typedef struct Node1
{
	int Link;
	struct Node1 *next_Adjacent;
}Adjacent;

typedef struct Node2
{
	int Order;
	int  k;
	double C;
	Adjacent *Head;
	struct Node2 *pre_Vertex;
	struct Node2 *next_Vertex;
}Vertex;

typedef	struct Node3
{
	int k;
	int k_SUM;
	struct Node3 *next_List;
}k_List;

typedef struct Node4
{
	int Order;
	struct Node4 *next_List;
}C_List;

/************Introduction******************************/
void Introducction(void);
/************Set Parameter*****************************/
void SetParameter(void);
/************Initial***********************************/
Vertex *Initial(void);
/************EXAM**************************************/
void Exam(Vertex *pHead_Vertex)
{
	long long k_TOTAL = 0;
	Vertex *pNext_Vertex = NULL;
	Adjacent *pNext_Adajcent = NULL;
	pNext_Vertex = pHead_Vertex;
	while(pNext_Vertex != NULL)
	{
		printf("%d\t", pNext_Vertex->k);
		k_TOTAL += pNext_Vertex->k;
		pNext_Vertex = pNext_Vertex->next_Vertex;
	}
	printf("k_TOTAL:%lld", k_TOTAL);
}
/************Add new Node***************************/
void AddNewNode(int Mark, Vertex *pHead_Vertex);
/************Caculate k***********************************/
void Caculate_k(Vertex *pHead_for_k);
/************Caculate P(k)***********************************/
void CaculatePofk(Vertex *pHead_Vertex);
/************Caculate C***********************************/
void CaculateC(Vertex *pHead_Vertex);
B、主函数

int main(void)
{
	system(&#
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值