这一个月是最苦逼的日子,因为在深圳先进研究院的最后实习的日子里,我和我导师在为了siggraph奋斗着,也希望能在本科阶段发上一篇论文,哈哈。
空闲之余,来分享一下研究过程中用到的一个树的算法吧。本算法的目的非常简单,就是剔除树的中间节点,保留分支节点。如下图要求:
转化如下
以上图是由http://www.graphviz.org/doc/info/lang.html生成
附上代码:
- def reduced_graph(subtree, v, graph):
- n = graph[subtree]
- if len(n) == 0:
- v[subtree] = []
- return [subtree]
- elif len(n) == 1: #one child
- r = reduced_graph(n[0], v, graph)
- v[subtree] = r
- if len(v[n[0]]) == 1:
- del v[n[0]]
- return v[subtree]
- else:
- next_sub = []
- for c in n:
- r = reduced_graph(c, v, graph)
- next_sub.append(r[0])
- if len(v[c]) == 1:
- del v[c]
- v[subtree] = next_sub
- return [subtree]
调用方法:
- v = {}
- graph = {0:[1], 1:[2], 2:[3, 4], 3:[5], 4:[6], 5:[7,8], 6:[9], 9:[], 7:[11], 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/
如果您想转载本博客,请注明出处
如果您对本文有意见或者建议,欢迎留言