vlei 发表于 2017-5-3 09:10:38

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

  请查看原文:
  http://www.ibaiyang.org/2012/12/09/%E6%A0%91%E7%AE%97%E6%B3%95%E6%9C%80%E5%A5%87%E8%91%A9%E7%9A%84python%E4%BB%A3%E7%A0%81/

这一个月是最苦逼的日子,因为在深圳先进研究院的最后实习的日子里,我和我导师在为了siggraph奋斗着,也希望能在本科阶段发上一篇论文,哈哈。
空闲之余,来分享一下研究过程中用到的一个树的算法吧。本算法的目的非常简单,就是剔除树的中间节点,保留分支节点。如下图要求:
http://www.ibaiyang.org/wp-content/uploads/2012/12/original-259x600.png
转化如下
http://www.ibaiyang.org/wp-content/uploads/2012/12/reduced.png
以上图是由http://www.graphviz.org/doc/info/lang.html生成
附上代码:
view plaincopy to clipboardprint?


[*]def reduced_graph(subtree, v, graph):  
[*]    n = graph  
[*]    if len(n) == 0:  
[*]        v = []  
[*]        return   
[*]    elif len(n) == 1: #one child  
[*]        r = reduced_graph(n, v, graph)  
[*]        v = r  
[*]        if len(v]) == 1:  
[*]            del v]  
[*]        return v  
[*]    else:  
[*]        next_sub = []  
[*]        for c in n:  
[*]            r = reduced_graph(c, v, graph)  
[*]            next_sub.append(r)  
[*]            if len(v) == 1:  
[*]                del v  
[*]        v = next_sub  
[*]        return   

调用方法:
view plaincopy to clipboardprint?


[*]v = {}  
[*]graph = {0:, 1:, 2:, 3:, 4:, 5:, 6:, 9:[], 7:, 11:[], 8:[]}  
[*]root = 0  
[*]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/
  如果您想转载本博客,请注明出处
  如果您对本文有意见或者建议,欢迎留言
页: [1]
查看完整版本: #树算法#最奇葩的PYTHON代码