现在的位置: 首页 > 综合 > 正文

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

2013年01月20日 ⁄ 综合 ⁄ 共 1378字 ⁄ 字号 评论关闭

这一个月是最苦逼的日子,因为在深圳先进研究院的最后实习的日子里,我和我导师在为了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/

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

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

抱歉!评论已关闭.