這一個月是最苦逼的日子,因為在深圳先進研究院的最後實習的日子裡,我和我導師在為了siggraph奮鬥著,也希望能在本科階段發上一篇論文,哈哈。
空閑之餘,來分享一下研究過程中用到的一個樹的演算法吧。本演算法的目的非常簡單,就是剔除樹的中間節點,保留分支節點。如要求:
轉化如下
以是由http://www.graphviz.org/doc/info/lang.html產生
附上代碼:
view plaincopy to clipboardprint?
- 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]
調用方法:
view plaincopy to clipboardprint?
- 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/
如果您想轉載本部落格,請註明出處
如果您對本文有意見或者建議,歡迎留言