#树算法#最奇葩的PYTHON代码

本文分享了一种用于树结构的算法,旨在去除中间节点,保留分支节点,提高树结构的简洁性和效率。通过实例演示并分析代码实现,强调了算法优化的重要性。同时,讨论了代码效率与Python函数调用开销的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一个月是最苦逼的日子,因为在深圳先进研究院的最后实习的日子里,我和我导师在为了siggraph奋斗着,也希望能在本科阶段发上一篇论文,哈哈。

空闲之余,来分享一下研究过程中用到的一个树的算法吧。本算法的目的非常简单,就是剔除树的中间节点,保留分支节点。如下图要求:

转化如下

以上图是由http://www.graphviz.org/doc/info/lang.html生成

附上代码:

  1. def reduced_graph(subtree, v, graph):  
  2.     n = graph[subtree]  
  3.     if len(n) == 0:  
  4.         v[subtree] = []  
  5.         return [subtree]  
  6.     elif len(n) == 1#one child  
  7.         r = reduced_graph(n[0], v, graph)  
  8.         v[subtree] = r  
  9.         if len(v[n[0]]) == 1:  
  10.             del v[n[0]]  
  11.         return v[subtree]  
  12.     else:  
  13.         next_sub = []  
  14.         for c in n:  
  15.             r = reduced_graph(c, v, graph)  
  16.             next_sub.append(r[0])  
  17.             if len(v[c]) == 1:  
  18.                 del v[c]  
  19.         v[subtree] = next_sub  
  20.         return [subtree]  

调用方法:

  1. v = {}  
  2. graph = {0:[1], 1:[2], 2:[34], 3:[5], 4:[6], 5:[7,8], 6:[9], 9:[], 7:[11], 11:[], 8:[]}  
  3. root = 0  
  4. reduced_graph(root, v, graph)  

图表示方法是:邻接矩阵表示法。

为什么说这个python代码非常奇怪呢,因为reduced_graph函数本身也返回值,其实参数V也是返回值。等项目结束后,希望能重构一下这个奇葩的代码。

在过程中还发现 len(n) == 0 没有 n==[] 高效,我也测试了二者的代码,后者快了N倍,可能是由于函数调用开销比较大吧。

 

-----------------打造高质量的文章 更多关注 把酒泯恩仇---------------

为了打造高质量的文章,请  推荐  一下吧。。。。谢谢了,请关注我后续的文章,会更精彩哦

请关注sina微博:http://weibo.com/baiyang26

把酒泯恩仇官方博客:http://www.ibaiyang.org 【推荐用google reader订阅】

把酒泯恩仇官方豆瓣:http://www.douban.com/people/baiyang26/

如果您想转载本博客,请注明出处

如果您对本文有意见或者建议,欢迎留言

转载于:https://www.cnblogs.com/ibaiyang/archive/2012/12/09/2810363.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值