六度空间
一个数学领域的猜想,名为Six Degrees of Separation,中文翻译包括以下几种: 六度分割理论或小世界理论等。 理论指出:你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个中间人你就能够认识任何一个陌生人。也叫小世界理论。(百度)
这个理论以前就听说过了,现在学了图论之后,感觉也就那样,好像没那么神奇。在现在每个人,至少大概能直接联系到的人能有100人吧?特别是有了微信qq等社交网络之后。老一辈的可能没那么多,怎么说也得有50人可以直接联系的到吧。
然后人是一群群分布的,每个人都有不一样的群,但是每个人的群之间或多或少有直接或间接的联系,群与群之间有不同程度的亲密度。
但是总的来说,每个人可以通过自己的群体认识到更多的群体更多的陌生人,从而导致指数增长,可以很快的在5-6层之间覆盖到好几十亿人。粗略算一下每一层一个人可以直接联系50个新人加入大群,6层。50的6次方等于15625000000一百多亿啊!
现在世界总人口75亿,完全可以在6步之间找到一个人。
理论归理论,但是现实找一个陌生人还是有点难度的。要看在什么情况,在网络上就简单,但是在没有网络交通也不发达的地方就难了。而且,你也不能让每层的人都去找,你只能像路由算法那样,通过一个个人传递,每次把信息传到他认为离目标最近的人,最终到达目标。
下面用python简单模拟了下六度空间
用广搜来确定走了几层
逻辑上有点不符合实际,每个人的交际圈,就是每个人能直接联系的人,是随机生成的,所以每个人所组成的群体,群体与群体之间的亲密度差不多,都认识的人数量(重复的人)也差不多。所以大概通过每个人新认识的人大概可能也就20多30几个吧。20的n次方。
import random
from queue import Queue
def bfs(start, graph):
queue = Queue()
queue.put([start, 0])
vis = [False for _ in range(len(graph))]
vis[start] = True
maxDegree = 0
while not queue.empty():
node, degree = queue.get()
maxDegree = degree
for nextNode in graph[node]:
if not vis[nextNode]:
queue.put([nextNode, degree + 1])
vis[nextNode] = True
return maxDegree
# 模拟一万个人空间的六度空间
# 每个人大概可以与50-100个人形成直接联系,因为会有重复,每个人实际上直接进入下一层的人数小于50-100人
n = 10000
min_max = (50, 100)
# 建立邻接表
graph = [[] for _ in range(n)]
for i in range(n):
# 每个人随机产生50-100之间的联系人
m = random.randint(min_max[0], min_max[1])
# 联系人从10000个人里面随机选出m位联系人
l = list(range(n))
random.shuffle(l)
for v in l:
if v != i:
graph[i].append(v)
if len(graph[i]) == m:
break
print('Six Degrees of Separation')
degree = bfs(0, graph)
print('max degree is: %d' % degree)
运行结果: