如何修复对''的同时访问,但修改需要Swift Graph中的独占访问

时间:2019-04-14 15:33:39

标签: swift

我正在尝试在Swift中创建一个图形,但是当我尝试对其运行一个containsCycle()方法时,出现以下错误:同时访问0x6000034cd220,但是修改需要互斥权限。原谅我,但我不理解其他类似(但不相同)的问题,所以我问了一个更具体的问题。感谢您的帮助!

class Node: Hashable {
    var val: String
    var neighbors = Set<Node>()

    init(val: String) {
        self.val = val
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(val)
        hasher.combine(neighbors)
    }

    static func == (lhs: Node, rhs: Node) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }
}

let a = Node(val: "a")
let b = Node(val: "b")
let c = Node(val: "c")
let d = Node(val: "d")
let e = Node(val: "e")
let f = Node(val: "f")
let g = Node(val: "g")
let h = Node(val: "h")
let i = Node(val: "i")
let j = Node(val: "j")
let k = Node(val: "k")

a.neighbors.insert(b)
a.neighbors.insert(c)
a.neighbors.insert(d)
a.neighbors.insert(e)

d.neighbors.insert(d) // <-- crashes here
d.neighbors.insert(a) // <-- or here, if I comment out the line above

c.neighbors.insert(g)
c.neighbors.insert(h)
c.neighbors.insert(a)

g.neighbors.insert(h)
g.neighbors.insert(c)

h.neighbors.insert(g)
h.neighbors.insert(c)

b.neighbors.insert(a)

e.neighbors.insert(a)
e.neighbors.insert(i)
e.neighbors.insert(j)
e.neighbors.insert(k)

i.neighbors.insert(e)

j.neighbors.insert(e)

k.neighbors.insert(k)

包含用于上下文的Cycle(),但是我的问题与上面的所有内容有关。

func containsCycle(_ node: Node) -> Bool {
    var seen = Set<Node>()
    return containsCycleRec(node, parent: nil, seen: &seen)
}

func containsCycleRec(_ node: Node, parent: Node?, seen: inout Set<Node>) -> Bool {
    seen.insert(node)
    for neighbor in node.neighbors {
        if !seen.contains(neighbor) {
            containsCycleRec(neighbor, parent: node, seen: &seen)
        } else if neighbor != parent {
            return true
        }
    }
    return false
}

1 个答案:

答案 0 :(得分:0)

给定2个彼此相邻的节点作为邻居,它会创建一种无限循环(据我理解),编译器不知道它们之间的引用循环在何处结束。因此,他们每个人都试图同时修改另一个。

a.neighbors.contains(d) // returns true
d.neighbors.contains(a) // returns true

由于这是一个图形问题,一个不错的解决方案最终是将图形仅表示为邻接表,而不是一系列互相引用的节点。

let adjList = [
    "a": ["d"],
    "d": ["a"]
]

我可能是错的(我很高兴学习新知识),但这是我对问题的理解和解决方案。