为什么data = copy.deepcopy(G)在Karger min cut算法中很重要?

时间:2016-10-23 04:57:35

标签: python min

以下是计算此处karger min cut algorithm in python 2.7发布的最小切割的代码。没有data = copy.deepcopy(G),找到最小切割的效率并不好。谁能解释为什么?感谢。

import random, copy
data = open("***.txt","r")
G = {}
for line in data:
    lst = [int(s) for s in line.split()]
    G[lst[0]] = lst[1:]   

def choose_random_key(G):
    v1 = random.choice(list(G.keys()))
    v2 = random.choice(list(G[v1]))
    return v1, v2

def karger(G):
    length = []
    while len(G) > 2:
        v1, v2 = choose_random_key(G)
        G[v1].extend(G[v2])
        for x in G[v2]:
            G[x].remove(v2)
            G[x].append(v1) 
        while v1 in G[v1]:
            G[v1].remove(v1)
        del G[v2]
    for key in G.keys():
        length.append(len(G[key]))
    return length[0]

def operation(n):
    i = 0
    count = 10000   
    while i < n:
        data = copy.deepcopy(G)
        min_cut = karger(data)
        if min_cut < count:
            count = min_cut
        i = i + 1
    return count


print(operation(100))

1 个答案:

答案 0 :(得分:0)

data = Gkarger(data)不会复制字典,而karger(data)会使用原始G字典。但karger会更改data中的值,因此会自动更改原始字典中的值。因此,karger(data)的下一次执行将使用具有不同值的字典。

删除deepcopy并在print(data)之前添加karger(data),您会在data中看到不同的值。