N度空间关系图

本文介绍了一种通过软件工具绘制社交网络关系图的方法,并探讨了如何利用这些图形来发现社区内部的潜在联系和规律,这对于业务决策如广告投放具有重要意义。


 

 

 

 

 

计算机绘图很麻烦,一定要找到好工具。

 

通过这些工具生成的图形可以让人们的思维更抽象,不必拘泥于数值的大小,可以凭感觉得到一些重要的信息,

比如从上面的依赖关系可以看到,哪些lib在rails中是很核心的。

 

这只是一个测试,真正的用途是用于生成N度关系。

目前能生成3度的SNS关系已经算很NB的事情了,而且即便生成了,谁又能看明白呢?

 

希望科技的进步有更发达的软硬件工具出现,通过3D显示器来观看N度SNS关系图。

 

 

 

做个实验吧,

我写了一个应用,使用者通过它访问自己的SNS社区,将该用户所在社区的好友及好友的好友的关系画成一张大图,

从中找到他关注的人,以及被关注的人关注的人,以及。。。在往下就是传说中的N度,当到了第六度的时候,这个关系谱中的人是整个地球的居民。。。

 

我目前只能画出1度和2度,而且2度画好了后居然还有内存不足的问题,(我的笔记本2GB,买不起高级货)

可想而知,画到6度会是多大的图。2度就已经看不清了,我试试传上来。

 

先来个一度的关系图:


再来个二度关系图:



 这个二度的很大,看起来相当的不舒服,会使用画图工具是个技术活,我下午刚刚找到一个工具,还不熟悉。

 

不过也可以看出以下问题:

1。社区的关系网的确很大很大,我期望在其中发现某种聚集的抽象信息和规律,这可以很好的指导业务行为,比如团购,比如广告投递人群等。

2。rails的库用的太乱了,跟关系网一样混乱。

 

 

想到哪儿说到哪儿,我不是内行,但想转行:)

### 关于PTA平台上的六度空间问题 #### 题目背景 “六度空间”理论描述了一个社会网络中的连接特性,即任意两个人之间的最短路径长通常不超过6。此问题的核心在于验证在一个给定的社会关系图中,是否存在大部分节点可以通过至多6步到达其他节点。 --- #### 解题思路分析 1. **建模** 将题目转化为一个无向图的遍历问题,其中每个人视为一个节点,两人之间的朋友关系表示为一条边。目标是统计每个节点到其余所有节点的距离是否满足条件。 2. **核心算法选择** 可以采用广优先搜索(BFS)或者深优先搜索(DFS)来解决这个问题。由于需要精确记录距离层次,推荐使用 BFS 来逐层扩展并计算距离[^4]。 3. **具体实现细节** - 输入处理:读取节点数量 \(N\) 和边的数量 \(E\),构建邻接矩阵或邻接表存储图的关系。 - 距离初始化:对于每一个起点节点,初始化其与其他节点的距离数组 `dist`,并将初始值设为无穷大(如 `-1` 或者较大的数值)。 - 层次遍历:利用队列进行 BFS 扩展,每次访问新节点时更新其距离,并标记已访问状态。 - 统计结果:针对每个起始节点,统计与其距离 ≤ 6 的节点比例,并输出相应百分比。 以下是基于 C++ 的代码实现: ```cpp #include <iostream> #include <vector> #include <queue> using namespace std; const int MAX_N = 1002; bool graph[MAX_N][MAX_N]; bool visited[MAX_N]; int dist[MAX_N]; void bfs(int start, int n) { fill(visited, visited + n, false); fill(dist, dist + n, -1); queue<int> q; q.push(start); visited[start] = true; dist[start] = 0; while (!q.empty()) { int u = q.front(); q.pop(); for (int v = 0; v < n; ++v) { if (graph[u][v] && !visited[v]) { visited[v] = true; dist[v] = dist[u] + 1; q.push(v); } } } } int main() { int N, E; cin >> N >> E; // 初始化图 for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { graph[i][j] = false; } } for (int i = 0; i < E; ++i) { int a, b; cin >> a >> b; --a; --b; // 转换为从0开始编号 graph[a][b] = graph[b][a] = true; } // 对每个节点执行BFS for (int i = 0; i < N; ++i) { bfs(i, N); // 计算符合条件的比例 int count_within_six = 0; for (int j = 0; j < N; ++j) { if (dist[j] >= 0 && dist[j] <= 6) { count_within_six++; } } double ratio = static_cast<double>(count_within_six) / N * 100; cout << i + 1 << ": " << fixed << setprecision(2) << ratio << "%" << endl; } return 0; } ``` --- #### 复杂分析 - 时间复杂:假设总共有 \(V\) 个顶点和 \(E\) 条边,在最坏情况下,每调用一次 BFS 函数的时间复杂为 \(O(V+E)\),而总共需对 \(V\) 个节点分别运行 BFS,故整体时间复杂约为 \(O(V \cdot (V + E))\)。 - 空间复杂:主要由邻接矩阵占用的空间决定,大小为 \(O(V^2)\)[^4]。 --- #### 注意事项 - 如果输入规模较大,建议改用邻接表代替邻接矩阵降低内存消耗。 - 输出格式应严格遵循题目要求,尤其是保留两位小数的部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值