簡體   English   中英

將元組(邊)列表轉換為Python中最長路徑的列表

[英]Convert a list of tuples(edges) into list of longest paths in Python

請看無花果。 下面。 作為項目的一部分,我需要將森林的邊緣列表轉換為唯一的最長路徑列表。 最長路徑實際上是將任何根節點連接到葉節點或將葉連接到葉節點的路徑。 這里的問題是,我只有邊列表作為輸入,我應該從中得出這些路徑。

我試圖通過使用字典(使用邊列表創建)查找鄰居節點來遞歸地解決此問題,但看來這不是處理該問題的正確方法,而且我發現很難可視化。 請提出是否有已知的有效算法/方法來解決此問題。

PS:請忽略重量(它們只是標簽)。 “最長”是指覆蓋最大節點的路徑。

輸入:
元組列表(邊)

edges = [('point', 'floating'), ('754', 'floating'),
('clock', 'IEEE'), ('ARM', 'barrel'), 
('barrel', 'shifter clock'), ('shifter', 'barrel'), 
('representation', 'representation'), ('cycles', '754'), 
('point representation', 'point'), ('barrel shifter', 'point')]

預期產量:

inference_paths = [
    ['cycles', '754', 'floating', 'point', 'point representation'],
    ['cycles', '754', 'floating', 'point', 'barrel shifter'],
    ['point repr', 'point', 'barrel shifter'],
    ['ARM', 'barrel', 'shifter clock'],
    ['shifter', 'barrel', 'shifter clock'],
    ['ARM', 'barrel', 'shifter'],
    ['clock', 'IEEE'],
    ['representation']
] 

我的失敗代碼:

edges = [('point', 'floating'), ('754', 'floating'), ('clock', 'IEEE'), ('ARM', 'barrel'), ('barrel', 'shifter clock'), ('shifter', 'barrel'), ('representation', 'representation'), ('cycles', '754'), ('point representation', 'point'), ('barrel shifter', 'point')]
neighbors = {}
inference_paths = []

for edge in edges:
    neighbors[edge[0]] = edge[1]

for edge in edges:
    neighbor = neighbors.get(edge[1])
    if neighbor:
        if not edge[1] == edge[0] == neighbor:
            inference_paths.append([edge[0], edge[1], neighbor])
        else:
            inference_paths.append([edge[0]])
    else:
        inference_paths.append([edge[0], edge[1]])


for path in inference_paths:
    print path

我的輸出:

[['point', 'floating'],
['754', 'floating'],
['clock', 'IEEE'],
['ARM', 'barrel', 'shifter clock'],
['barrel', 'shifter clock'],
['shifter', 'barrel', 'shifter clock'],
['representation'],
['cycles', '754', 'floating'],
['point representation', 'point', 'floating'],
['barrel shifter', 'point', 'floating']]

森林:

在此處輸入圖片說明

我相信您的問題是,您說您正在使用遞歸,但是您沒有。 嘗試反復執行此操作很痛苦。 首先讓我們看一下基本的遞歸樹遍歷函數。

function traverseTree(node) {
    if(node == NULL) return;
    traverseTree(node->leftSubTree);
    traverseTree(node->rightSubTree);
}

上面的函數將訪問樹中的所有節點,現在我們只需要弄清楚我們需要計算什么邏輯來找出路徑等。 注意:您的答案似乎暗示給定節點只能在路徑中使用一次,並且不能再次越過,因此使用此假設。

arrayOfPaths;
function traverseTree(node) {
    if(node == NULL) return emptyPathObject;

    leftPathObject = traverseTree(node->leftSubTree);
    rightPathObject = traverseTree(node->rightSubTree);
    arrayOfPaths.add(leftPathObject + node + rightPathObject);
    return ((node + leftPathObject) or (node + rightPathObject) whichever is longer);
}

//Code to figure out which paths are the longest here.  This is simpler than the other one too! :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM