传球问题图解

今天翻陈皓(http://coolshell.cn)前辈的博客,看到一些有意思的题目,比如这个:http://coolshell.cn/articles/1976.html

有a,b,c,d,四个人
互相传球
从a开始传出
经过5次传球后
球回到a的手里

算总共有多少种传球的方法

下面评论里面很多高手给出了排列组合公式的算法,无奈这方面学的不好,只好在纸上画了树状图来揣摩。

首先球在a手里,第一次传球a可以传给b,c,d三人。如果传给了b,那么第二次传球b可以传给a,c,d三人。我们把传球的情况画成如下的三叉树:


从树状图和下面的表格总结我们可以得出规律:

第N次传球后,球能够到达某人手里的方法数 == 第N-1次传球后,球不在某人手里的方法数 == 第N-1次传球后,球在其他人手里的方法数之和

例如:

两次传球后,球在a手里的方法数 = 一次传球后,球不在a手里的方法数 = 一次传球后,球在b,c,d手里的次数相加 = 1+1+1 = 3

两次传球后,球在c手里的方法数 = 一次传球后,球不在c手里的方法数 = 一次传球后,球在a,b,d手里的次数相加 = 0+1+1 = 2


具体表现在表格里面,也就是:下一排某个位置的数值,应该等于上一排除了该位置之外的其他位置相加之和。

例如:第三次的c位置的值 = 第二次的a,b,d之和 = 3+2+2 = 7。

所以:

经过5次传球后,回到a手里的方法数 = 4次传球后,球在b,c,d手里的方法数之和

= 4次传球后,球在b手里的方法数 + 4次传球后,球在c手里的方法数 + 4次传球后,球在d手里的方法数

= 3次传球后,球在a,c,d手里的方法数 + 3次传球后,球在a,b,d手里的方法数 + 3次传球后,球在a,b,c手里的方法数
=3次传球后 a + c + d + a + b + d + a + b + c = 3a + 2b + 2c + 2d = 18 + 14 + 14 + 14 = 60

知道求法之后,我们可以写代码实现,简单点可以写成递归调用,但是因为有重复计算所以会比较慢,要想时间和空间效率都比较好,就采用递推的方式,空间复杂度O(2n)。

 


### NetworkX NBA 应用实例 #### 使用NetworkX分析NBA球员关系网络 通过构建和可视化NBA球员之间的传球网络,可以深入了解球队内部的合作模式。具体来说,可以通过以下步骤来创建这样的网络: 1. **数据收集** 收集比赛中的传球记录作为边的数据源。每条边代表一次成功的传球事件,连接两名参与传球的球员节点。 2. **建立图结构** 利用`networkx.Graph()`函数初始化无向图对象用于表示静态的关系网;对于动态变化的比赛过程,则可选用有向加权图`networkx.DiGraph()`, 权重反映两人间相互传递球次数的多少[^1]。 3. **属性设置** 向每个节点添加额外的信息比如球员姓名、位置等标签,以及给定边上附加具体的统计数值如成功传球数或成功率等特征参数。 4. **计算指标** 计算度中心性(Degree Centrality),接近中心性(Closeness Centrality), 中介中心性(Betweenness Centrality)等各种衡量个体重要性的拓扑学测量值, 揭示哪些成员处于团队协作的核心地位. 5. **绘制图形** 借助matplotlib库完成最终图表呈现工作,直观展示上述所得结论并辅助进一步解释说明[^4]: ```python import networkx as nx import matplotlib.pyplot as plt # 创建一个空的有向图G G = nx.DiGraph() # 添加节点与边 (此处仅为示意) players = ['Player A', 'Player B'] edges = [('Player A', 'Player B')] weights = [7] for player in players: G.add_node(player) for i, edge in enumerate(edges): G.add_edge(edge[0], edge[1], weight=weights[i]) pos = nx.spring_layout(G) nx.draw_networkx_nodes(G, pos, node_size=[v * 100 for v in weights]) nx.draw_networkx_edges(G, pos, edgelist=G.edges(), width=weights) nx.draw_networkx_labels(G, pos) plt.show() ``` 此代码片段展示了如何使用NetworkX处理简单的NBA球员间的传球关系,并借助Matplotlib进行基本的可视化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值