`
把酒泯恩仇
  • 浏览: 26343 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

#树算法#最奇葩的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.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/

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics