我有一行代碼,我不完全理解,並希望一些更容易的替代。這是做什麼的,使用weightList,它是一個相互連接的邊的列表,並從圖(鄰接矩陣)中返回具有最低相應值的邊列表。這是針對Prim的最小生成樹問題。替代這個python代碼?
edge = sorted(weightList, key=lambda e:graph[e[0]][e[1]])[0];
我有一行代碼,我不完全理解,並希望一些更容易的替代。這是做什麼的,使用weightList,它是一個相互連接的邊的列表,並從圖(鄰接矩陣)中返回具有最低相應值的邊列表。這是針對Prim的最小生成樹問題。替代這個python代碼?
edge = sorted(weightList, key=lambda e:graph[e[0]][e[1]])[0];
打破它一點點可能是不夠的。這個怎麼樣?
get_edge_weight = lambda e: graph[e[0]][e[1]]
sorted_weights = sorted(weightList, key=get_edge_weight)
edge = sorted_weights[0]
正是我需要的。代碼現在有道理。謝謝 –
完全按照你所說的:對於所有的邊緣,找到圖中最低的值。
i, j = current_edge = weightList[0]
current_min = graph[i][j]
for edge in weightList[1:]:
i, j = edge
if graph[i][j] < current_min:
current_min = graph[i][j]
current_edge = edge
你開始與第一邊緣從weightList
,那麼你遍歷所有其他的邊緣,試圖找到一個值,該值較低。當您退出循環時,current_edge
是具有最低值的邊緣。
這就是說,它可能是值得的,而不是試圖理解你的代碼。我假設你知道sorted
做什麼。要對weightList
進行排序,sorted
使用參數key
,該參數是一個返回值的函數。在你的情況下,你的函數在你的邊緣位置返回的值。 sorted
將使用此值來比較邊緣。
因此,這會將所有邊從最低值的邊到最高值的邊進行排序。然後,一旦它被排序,就會獲取第一個元素,即具有最低值的邊。
在算法上,使用sorted
這個工作並不是一個好主意,因爲它的時間複雜度爲O(n log n)
。相比之下,我的算法是O(n)
(但可能更慢,因爲我認爲sorted
在C中實現)。相反,您可以通過使用min
,這當然是最有效和最可讀的選擇了三個所有獲得使用標準功能O(n)
相同的結果:
edge = min(weightList, key=lambda (i,j): graph[i][j])
如果你想要的代碼是一個少一點「緊湊」,這應該做的伎倆:
shortest = weightList[0]
for edge in weightList:
if graph[edge[0]][edge[1]] < graph[shortest[0]][shortest[1]]:
shortest = edge
設置最短邊等於在weightList第一邊緣,然後通過列表,查看是否有任何邊緣短。
當試圖降低複雜性,我總是想辦法打破東西伸到言自明的,模塊化的功能:
def distance(adjacency_matrix, start_node, end_node):
return adjacency_matrix[start_node][end_node]
sorted_edges = sorted(weightList, key=lambda e: distance(graph, e[0], e[1]))
edge = sorted_edges[0];
這是偉大的,你現在明白了,線,但它可能是值得一說的它不是」這是一種特別有效的方式。你應該使用'min'而不是'sorted'。 –